跳轉到內容

計算物理學/第一章

來自華夏公益教科書

電子表格程式

[編輯 | 編輯原始碼]

本書將描述如何具體使用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]

醉漢走了多遠?

[編輯 | 編輯原始碼]

在寫這部分時,試著算出來!

華夏公益教科書