跳转到内容

计算物理学/第一章

来自维基教科书,开放世界中的开放书籍

电子表格程序

[编辑 | 编辑源代码]

本书将描述如何具体使用Microsoft Excel,因为这是一个广泛使用的程序。如果您有权访问该程序并熟悉它,建议您使用它。如果您有其他首选的电子表格程序,请随意使用,但请注意,您需要参考帮助部分,了解您的电子表格程序与本书的不同之处。

如果您想要一个适用于几乎所有操作系统的免费电子表格程序,那么来自OpenOffice.org的“Calc”强烈推荐。希望将来本书会介绍如何使用它以及Microsoft Excel。

为什么要使用电子表格?本章旨在向您展示,无需学习和输入过量的代码,您就可以快速简便地完成工作。我们将在最后看到使用电子表格有其局限性,但希望也能看到电子表格除了用于绘制实验结果图表之外的强大功能!

电子表格程序示例

[编辑 | 编辑源代码]

使用电子表格计算常微分方程的数值解

[编辑 | 编辑源代码]

如果x是实变量t的函数,f是x和t的函数,那么方程

             x’(t) = f(x(t), t) 		(1.1)

称为一阶微分方程。求解此类方程不仅仅是代数运算;实际上,虽然方程本身包含三个量x、f和t,但要找到解,我们必须确定一个仅根据自变量t定义的函数x,它满足(1.1)中对某个开区间的全部t的关系。对于许多方程,无法获得精确解,我们必须依赖近似解。我们将讨论一种技术,用于寻找微分方程的近似解和精确解(如果可能)。我们已经看到许多微分方程的示例,我们讨论过在已知其速度函数和初始位置的情况下如何找到直线上运动物体的位移,以及我们讨论抛射体运动、我们考虑二体问题时的情况。实际上,在许多方面,微分方程的研究是微积分的核心。要研究物理世界中物理体的相互作用,就要研究万有引力定律和牛顿第二运动定律等物理定律的影响,这些定律经常会引出涉及求解微分方程的问题。牛顿是第一个认识到微积分对于解决各种物理问题的强大力量的人。在他之后出现的数学家扩展和完善了他的技术,直到他们开始相信,宇宙的未来,以及它的过去,都可以从所有物理体的当前位置和速度以及它们之间作用的力中推断出来。今天,我们对我们知识的局限性有了更多的了解,但无论如何,微分方程的研究仍然是我们理解宇宙的关键组成部分。为了开始我们的研究,考虑方程

                   x’(t) = f(x(t), t)		(1.2)

以及初始条件x(t0) = x0。为了简化符号,我们经常在提到x(t)时省略自变量,只写

                      x’ = f(x, t)		 (1.3)

现在,如果f(x, t)仅取决于t的值,即对于所有x值,f(x, t) = g(t),其中g是仅t的函数,那么我们可以通过积分来解(1.3)。也就是说,对(1.3)的两边积分得到

            x(t)  - x(t0) =   integral of [g(t), over [t,to]]	(1.4)


得到

            x(t) = x(t0) + integral of [g(t), over [t,to]]	(1.5)

假设我们可以计算定积分,至少可以始终通过数值计算得到,我们就解出了微分方程。

例如

考虑方程

          x’ = 4 sin(3t)

以及初始条件x(0) = 5。那么

              x(t) = 5 - 4/3 cos3t + 4/3 = 1/3 (19 - 4 cos(3t)).

知道t的值,我们就可以计算x在t处的精确值。

实际上,了解求值普通定积分的难度,不难相信许多(如果不是大多数)微分方程只能通过数值近似来求解。虽然方程(1.3)中的函数x是未知的,但我们有足够的信息来找到它在t0处的最佳仿射近似。也就是说,在t0处对x的最佳仿射近似是通过泰勒定理使用整个区间[t0,t]的子区间[t0,t1]获得的。

    x(t1) = x0 + f(x0, t0)(t - t0) + 0((t - t0)2 +...). where t1 = t0+h 	(1.6)

等价地,

                  x(t0 + h) = x0 + hf(x0, t0)		(1.7)

因此,对于h的较小值,

                     x1 = x0 + hf(x0, t0)			(1.8)

其中

                     h = t1 – t0/n

(在上例中,n = 1)

将提供对x(t0 + h)的良好近似。但是,我们想要做的不仅仅是这些;因为x是一个函数,所以我们希望能够在整个区间内(例如[t0, t])近似它的值。为此,我们选择一个较小的h值,并迭代提供x1的步骤。具体来说,我们令t = t0 + nh,n = 0,1,2。 3,…,其中n足够大,欧拉方法的广义形式是

                xn+1 = xn + hf(xn, tn) 			(1.9)

也就是说,我们通过对x(tn)的近似值应用最佳仿射近似来计算x(tn+1)的近似值,重复该过程足够多次,直到我们对整个区间[t0, t]上的x进行近似。这种近似方法被称为欧拉方法。

欧拉方法

[编辑 | 编辑源代码]

要对区间[t0, t]上初始条件x(t0) = x0的方程

                           x’ = f(x, t)

的解进行近似,选择一个较小的h > 0值和一个整数n,使得t0 + nh = t。令t = t0 + nh,使用差分方程xn+1 = xn + hf(xn, tn)(1.10)计算x1、x2…。 xn+1。那么xn+1就是x(t0 + nh)的近似值。

考虑微分方程x’ = 0.04x,初始条件x(0) = 50。我们知道该方程的解是

                       x(t) = 50e 0.04t .

特别地,x(50) = 50e 2 = 369.45,将答案四舍五入到小数点后两位。为了使用欧拉方法对区间[0, 50]上的x进行近似,我们首先取h = 1,从x0 = 50开始,计算x1、x2… x50,在本例中,xn+1 = xt将近似x(t)。使用(1.9),其中f(x, t) = 0.04x,并将结果四舍五入到小数点后两位,我们得到

n = 1:x1 = x0 + h(0.04x0) = 50 + (1)(0.04)(50) = 50 + 2 + 52.00

n = 2:x2 = x1 + h(0.04x1) = 52 + (1)(0.04)(52) = 52 + 2.08 = 54.08

n = 3: x3 = x2 + h(0.04x2) = 54.08 + (1)(0.04)(54.08) = 54.08 + 2.16 = 56.24

等等,最后得到x50 = 355.33。

请注意,近似值的误差,即xn和x(n)之间的差,随着n的增加而增加。例如,

x(5) - x5 = 0.24,而

x(50) - x50 = 14.12。

这应该是意料之中的,因为每一步的近似误差都会因前面每一步产生的误差而累加。我们控制近似值误差量的唯一方法是减小步长。例如,如果我们将步长减小到h = 0.1,我们将得到

x1 = x0 + h(0.04x0) = 50 + (0.1)(0.04)(50) = 50 + 0.2 = 50.2000, x2 = x1 + h(0.04x1) = 50.2 + (0.1)(0.04)(50.2) = 50.4008, x3 = x2 + h(0.04x2) = 50.4008 + (0.1)(0.04)(50.4008) = 50.6024, …………………………………………………………………. ……………………………………………………………….. 最后得到

x500 = 367.98(这可以使用计算机轻松计算)

我们必须计算x500的值,并将其等同于x50,因为根据参数h的定义

h = (t – t0)/n

将h=0.1代入,很明显,n的值(实际上是迭代次数)对于t0 = 0和t = 50将变为500。[Alay]

使用电子表格计算积分的数值解

[编辑 | 编辑源代码]

在微积分中,我们遇到非常复杂和难以计算的积分。使用解析方法很难找到它们的数值解。这个问题可以通过使用数值积分来解决,例如矩形法则、求和定义的极限、梯形法则和辛普森法则。

梯形法则

[编辑 | 编辑源代码]

考虑由x=a到x=b限制的y = f[x]。根据定义,函数x即y关于x的积分是曲线AB下方的面积,如图所示

         Area =  F[x] = integral [f(x), over[a,b]dx

现在将梯形分成一个矩形和一个近似三角形,即矩形的数量n = 1,我们可以写成

F[x] = h f[a] + ½ h {f[b] – f [a]}

= h {f[a] +1/2f[b] – 1/2f[a]}

= h/2 {f[a] + f[b]} = h/2 {f[x0] + f[x1]}

当 n = 2 时,我们有两个矩形和两个三角形,因此曲线下的近似面积变为

        F[x] = h/2 {f[a] +f[{a+b}/2]}+ h/2 {f[{a+b}/2] + f[b]}

= h/2 {f[a] + 2f[{a+b}/2] + f[b]}

= h/2 {f[x0] + 2f[x1] + f[x2]}

因此,将梯形分成 n 个部分进行推广,我们有

F[x] = h/2 {f[x0] + 2f[x1] + 2f[x2] + … + 2f[xn-2] + 2f[xn-a] + f[xn]}

是 y = f[x] 积分的近似值。

其中 h = b – a/n

n 可以是偶数或奇数。可以使用较大的 n 值来提高精度。[Alay]

进一步阅读

[编辑 | 编辑源代码]

随机游走

[编辑 | 编辑源代码]
一个包含 100 步的一维随机游走示例。y 轴从 25 步南 (-25) 到 (25) 步北 (25)

这是一本面向物理学家的书,所以让我们直接进入并描述我们想要研究的物理学。随机游走是一个出现在各种物理领域中的问题,例如布朗运动,它描述了分子在流体中如何运动(流体可以是液体或气体)。它还在量子场论中起作用,但这要复杂得多。在物理学之外,随机游走可以应用于股票价格。有趣的是,通过研究一个问题,我们找到了对完全不同的问题的解决方案,它们彼此之间没有其他关系。这是物理学中普遍存在的现象,例如波可以用来模拟交通流。

那么什么是随机游走呢?想象一个喝醉的人(如果你喜欢的话,你自己在晚上出去玩之后)刚离开他们当地的酒吧。他站在酒吧外,因为喝醉了,他随机地在街上向北走一步或向南走一步。他向北走或向南走的概率是相等的,他所有步长都相同。如果他这样走 100 步,他平均离酒吧有多远?你可能会认为他平均会离酒吧很近,但实际上并非如此!(记住,距离是指他离酒吧多少米,不考虑他的位置。如果我们发现他的平均位置,将北视为正,南视为负,那么根据对称性,我们知道他确实会在平均情况下结束在酒吧外。)

我们将研究这个问题,并找到他最终实际距离的远近。这被称为一维随机游走,因为醉汉只走北或南。同样的想法可以应用于二维,比如一个在田野里踉踉跄跄地走北、南、东或西的醉汉。三维也可以类似地进行研究,甚至四维或更多维,尽管这是一个有点抽象的想法!

你现在能看到这与布朗运动(分子随机运动)或股票价格(涨跌的机会大致相等)有什么关系吗?[John]

进行一维随机游走

[编辑 | 编辑源代码]

在电子表格中的空白工作表上,双击单元格 **B4** 并输入 **=RAND()** 然后按回车键。现在您应该在单元格 **B4** 中看到一个介于 0 和 1 之间的十进制数。尝试多次按下 **F9** 键,这将重新计算整个电子表格。您应该看到单元格 **B4** 中随机生成数字。顺便说一下,指定单元格 **B4** 是为了在引用特定单元格时保持一致性。如果您愿意,稍后它还可以让电子表格整齐地格式化!关于格式化,当前可能没有显示整个随机数,如果单击单元格 **B4** 使其突出显示,然后转到“格式”菜单,选择“列”,然后选择“自动调整选择”,则将显示单元格的全部内容。这可以对整个工作表进行,您可以通过单击工作表左上角的灰色框来完成此操作,

那么,我们为什么输入我们输入的内容呢?如果您熟悉电子表格,您可能很清楚 = 指定我们输入的是数学函数,而不仅仅是文本。RAND() 是电子表格识别为生成随机数请求的函数。如果现在还不清楚,在我们完成本章的其余部分时就会变得清楚。

我们如何将其转换为随机游走?我们需要将这个随机数转换为一个具有 50:50 概率的事件。我们需要做的是,如果数字小于 0.5,则生成一步南,如果数字大于 0.5,则生成一步北。这是我们看到一个简单的电子表格如何转换为程序的地方。

双击单元格 **C4** 并输入:**=IF(B4<0.5,-1,1)**。这比之前的函数要复杂一些!**IF** 函数的作用是,如果指定的条件为真,则将单元格的值设置为一个值,如果条件为假,则设置为另一个值。此函数的结构如下:**IF(条件,如果为真时的值,如果为假时的值)**。**B4<0.5** 是条件,这意味着“如果单元格 **B4** 小于 0.5”。

您现在应该能够算出随机数的哪些值会导致它向南走一步(生成 -1)或向北走一步(生成 1)。如果没有,请尝试一下,看看结果!它应该与我们之前说的一样工作。

走一步并不特别令人兴奋或令人印象深刻(或者如果你认为它很令人兴奋,你会绝对喜欢这本书的其余部分!),所以我们将看看如何将其扩展到 100 步。实际上非常容易,只需单击单元格 **B4** 使其选中,然后将鼠标移到右下角的小方块上。鼠标光标将发生变化,然后您可以向下拖动以使用此单元格中的相同公式填充下面的单元格。向下拖动到单元格 **B103**,以便我们走 100 步。填充列 **C** 中的单元格甚至更容易,您现在所要做的就是双击单元格 **C4** 右下角的小黑方块,这将将其填充到与列 **B** 相同的行。请注意,在单元格 **C4** 中,我们有一个依赖于 **B4** 中函数值的函数。但是,当我们填充其他单元格时,它们会自动更改,以便函数依赖于左侧单元格的值。这通常非常方便,但我们将在稍后看到,有时我们需要覆盖它。

现在,我们可以按下 **F9**,每次都会生成一个随机游走!但是,它仍然没有看起来很有趣,或者说信息量很大,我们无法看到醉汉在哪里,除非我们现在将所有单元格加起来,我们也无法看到他在任何特定位置。这很容易纠正,在 **D4** 中输入函数 **SUM(C$4:C4)**。希望您能猜出这是做什么的,它将 **C4** 到,嗯,**C4** 之间的所有单元格加起来(求和)。您可能认为这并不太有用,为什么那里有 $ 符号?好吧,如果您向下填充到下面的单元格,您会看到每个单元格都会将所有已采取的步骤的总和加起来,并给出醉汉在这一步之后的当前位置。如果您查看单元格 **D20**,您应该了解正在发生的事情,此单元格将 **C4** 和 **C20** 之间的总和加起来。$ 符号的作用是在您向下填充单元格时修复一个值。

现在,您可以使用电子表格制作随机游走的图表,如果您不知道如何操作,请查看电子表格的帮助部分。作为一些使图表看起来更好的提示,在单元格 **D3** 中输入“0”,以便醉汉可以从酒吧外开始,然后选择折线图。按下 **F9** 以生成新的图表。

您创建的图表是否符合您的预期,它们是否真的看起来*随机*?您可能会在一些图表中看到一些奇怪的模式,但它们确实是随机的!这将有望让您思考随机模式的真实样子。[John]

醉汉走了多远?

[编辑 | 编辑源代码]

在写这部分时,试着算出来!

华夏公益教科书