從1+1到混沌 | Mathematica系列教程·第一集

為什麼要學習Mathematica?在一些科研工作中,「敏捷」是非常重要的。有的時候,一個點子想出來了,如果覺得自己半個小時就能驗證,那大多數人就會立刻去做;而若是覺得這個點子需要大量的時間來驗證,心生畏懼,可能就會拖著、甚至不做。這樣就會產生非常大的效率差異。(有研究證實,Mathematica的平均代碼量,正比於C語言代碼量的開根號)


視頻教程

註:視頻教程中會有更多細節,建議以視頻為主,文稿為輔。

【從1+1到混沌】Mathematica科學計算教程 第一集_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili?

www.bilibili.com圖標

文字概要

大家好,這是我們的第一節Mathematica課程。在每一節課程中,我都會用一個完整的例子,來教大家學習Mathematica的常用操作。

我們知道,在風雨、雷電,這些自然現象的背後,可能存在著非常簡潔的物理學規律。但精確的天氣預報卻一直是一個難題,在四十年前,七天天氣預報的準確度在40%左右徘徊,時至今日,準確度也剛剛超過了「及格線」——60%。

而預報的困難,來自於「混沌」。一個「混沌系統」,對於初值非常敏感,而由於計算技術的限制,誤差總是不可避免,因此,我們對混沌系統,是無法作出長期、精確的預測的。而氣象體系,恰恰是一個混沌、複雜的系統。

在近六十年之前,Lorenz在研究大氣對流的時候,發現自己列出的方程組,對初值非常敏感,一點點擾動,就會在後期,產生巨大的差異。這就是著名的「洛倫茲系統(Lorenz System)」。而要能研究這類系統,就需要使用計算機去處理微分方程,對計算結果進行可視化處理。而Mathematica,則是進行這些工作的絕佳選擇。

{egin{aligned}{frac {mathrm {d} x}{mathrm {d} t}}&=sigma (y-x),\{frac {mathrm {d} y}{mathrm {d} t}}&=x(
ho -z)-y,\{frac {mathrm {d} z}{mathrm {d} t}}&=xy-eta z.end{aligned}}

這是我們的第一節Mathematica課程,我想以洛倫茲系統為引子,來介紹基本的Mathematica操作。包括軟體的基本操作與設置,常用的代碼。同時,我會介紹在實際的科學研究中,如何管理一個Mathematica工程。

如何獲取正版的Mathematica軟體:國內的用戶,一般推薦從中科院軟體中心購買(郵件聯繫:mathematica@sec.ac.cn, xmi@sec.ac.cn),會有很大的優惠。

1+1

Mathematica擁有非常先進的符號計算系統,以及強大的數值計算系統。但在一開始,我先演示一下最基本的計算操作。

歡迎界面

在歡迎界面,直接點擊左上角的「新文檔」,就可以新建一個「筆記本」。「筆記本」(notebook),是Mathematica中最常用也最便捷的文檔格式。

筆記本

這裡可以看到一個橫向的游標,可以直接輸入代碼,輸入之後,就會變為常見的縱向游標。我們首先進行最為基本的計算:1+1

輸入:1+1,按下Shift+Enter,就會在下面得到計算結果:2

注意下面會出現一個「建議欄」。建議欄的作用,就是根據輸出的結果,提示一些相關的操作。這在初期階段,是非常有用的學習資源,建議開啟。

比如說,我們做另一個計算:1234+4321,得到:

直接點擊「質因數分解」,就會自動生成新的計算單元:

那麼借這個機會,我們就可以了解質因數分解需要什麼函數來處理。而要深入學習的話,則可以點擊這個函數,按F1,或者右鍵點擊「獲取幫助」,來查看Mathematica的幫助文檔。Mathematica的幫助文檔寫的非常好,非常容易理解。

幫助文檔

Mathematica的幫助文檔是Mathematica的創始人,Stephen Wolfram親自寫作的。Wolfram的經歷非常傳奇,他在15歲的時候就發表了第一篇粒子物理學論文,並發表在學術期刊上(http://www.stephenwolfram....hadronic-electrons.pdf)。而後來,他轉向對元胞自動機的研究,也「順便」開發了Mathematica語言(現在叫 Wolfram Language)。

作為自己親手締造的語言,Wolfram自然在幫助文檔上下足了功夫。比如,在幫助文檔下面,會有「參見」欄,會列出相關的函數。很多時候,如果你覺得應該有某個函數,但又不知道的時候,就可以利用「參見」欄,跳躍式的查找相應的函數。

舉個例子:我們想找到「給出下一個素數」的函數。當我們熟悉了Mathematica之後,其實在直覺上可以判斷,某個功能的函數是否存在。以我的經驗,這個函數是大概率存在的。那麼,我們從素數Prime開始查找,可以看到,「參見」欄中,有一個叫做「NextPrime」的函數,很明顯,就是我們要找的函數。

順便說一句,建議欄還存在一些bug,當輸出數據非常龐大的時候,可能會引起內核崩潰。即使是我們使用分號關閉顯式的輸出時,建議欄也可能引發崩潰。所以在熟悉了Mathematica之後,反而會建議大家關閉。

好,參考文檔暫時打住,我們回到一開始的主要目標:構造洛倫茲系統。

表達式與輸入

我們知道,公式是數學、物理研究的基石之一。所以在一開始,我們就要學會基本的表達式輸入。最基本的表達式,就是單個的符號。比如說,a, b, c這樣的代數式。我們試著計算(a+b)/b:

這裡我們用control+/鍵,可以輸入手寫形式的表達式。非常直觀,後面在使用的時候,會一一演示。大家也可以直接看屏幕左下角的鍵位記錄。

可以看到,Mathematica似乎就是按照原式直接輸出了,沒有進行化簡。實際上如果我們輸入a-a的話,可以看到,Mathematica是進行了最基本的化簡的:

想要化解前面的式子,我們可以使用Simplify函數:

這裡還是沒有任何變化。這是因為Mathematica認為這樣的表達式比a/b+1還要簡潔一些。我們試一試其他表達式:

在表達式的後面,我們加上一些限制條件。Mathematica默認代數符號是屬於複數域的,想要化簡為下面的形式,就必須制定a,b是實數。

對於一些特殊的符號,比如 alphaeta ,可以用ESC+a+ESC, ESC+b+ESC來輸入,這在後面也會逐步介紹。

繪圖

學會輸入表達式之後,我們就可以進行函數的可視化輸出了。

使用Plot函數進行繪圖。Plot函數的格式非常簡潔:Plot[函數,{變數,變數最小值,變數最大值}]

進一步的,有Plot3D函數:

Mathematica中,繪圖函數基本都是這樣的格式:函數名[表達式/數據,範圍]。所以就不贅述了,在視頻教程中,有詳細的解讀。

微分方程/函數

前面說到,洛倫茲系統是由微分方程表示的。Mathematica中,使用DSolve解符號微分方程,使用NDSolve解數值微分方程。先從DSolve開始說:

其中C[1],表示第一個待定係數,而且任意一個C[1]都是上面微分方程的解。如果有多個表達式,可以使用花括弧括起來。上面解的方程,其實就是:

dot y+y=a sin x, y=y(x)

可以引入邊界條件:

我們來嘗試一下解洛倫茲方程:

可以看到,Mathematica並沒有解這個方程,而是直接把輸入代碼直接輸出了。這是因為這類方程通常都沒有解析解,自然也無法直接表達出來。

這個時候,我們就需要使用數值方法來解方程。Mathematica提供了NDSolve來解數值微分方程。

其給出了一個替換列表,即將x,y,z分別替換為對應的插值函數。

這個時候,我們就可以進行可視化操作了:

上圖中,{x[t],y[t],z[t]}/.ans的意思是,使用ans中定義的x,y,z,來替換/.之前的xyz,這樣就可以將圖像繪製出來。

這裡有很多這些,可以通過修改PlotPoints來獲得更加平滑的圖像:

我們可以看到,這個方程的係數都是在代碼中給定的,如果我們想要修改係數的話,就需要回到前面的代碼中手動去改。這樣就很不方便,我們定義一個函數來返回計算結果:

函數在本質上,是一個「替換規則」。比如上圖中的,就是要將 
ho,sigma, eta 替換為後來調用時的數值。而在調用函數時,Mathematica使用的是「模式識別」。只要符合L[{., ., .}, {., ., .}, .]的形式,都會使用後面的定義。而若是有差別,則不會報錯,而是原樣輸出。

由於這個性質,我們可以定義很多有意思的函數,比如說:

delta_{i,j}

可以直接在Mathematica中按照這樣的格式定義,非常形象。(具體參見視頻教程)

科研層級的Mathematica工程

如果你處理過大規模的Mathematica程序,就會發現,每一次關閉、再打開的時候,都要重新運行之前定義過的函數。有時候有幾十個函數層層嵌套,處理起來很費時間。有時在函數中間,還會夾雜一些其他的代碼,會使得人在處理的時候,非常難受。

這個時候,就要引入Mathematica的程序包。在重新打開程序的時候,直接導入程序包,就可以導入所有需要的函數,效率會非常高。

而更重要的是,使用程序包將代碼打包,會在分享程序的時候非常有用。別人不清楚你代碼的結構,如果直接一個notebook文件發過去,他通常無法正確使用。而用程序包打包之後,問題就引刃而解了。

程序包的使用細節,參見視頻教程。

練習

大家可以嘗試使用Mathematica製作一個繪製雙縫干涉圖像的程序包。程序可以根據縫間距、波長、縫到屏幕的距離,直接繪製出圖像。大家可以訂閱我在「知識星球」上的專欄(見文章最後),在其中分享自己的作業,我會與大家進行交流。

【從1+1到混沌】Mathematica科學計算教程 第一集_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili?

www.bilibili.com圖標


在線答疑/交流/分享

最後,希望大家能夠支持這個Mathematica系列教程。

我在「知識星球」上開了一個專欄,會更新一些「奇技淫巧」,也會回答訂閱了專欄的朋友們的問題。如果有一些集中的問題,還會「定製」一些視頻教程,優先在知識星球上分享。

(點開鏈接後,用微信掃描)

推薦閱讀:

為什麼在 Mathematica 中使用循環是低效的?
Matlab 怎麼填充曲線相交的區域呢?
為什麼Mathematica里矩陣索引這麼慢,有沒有什麼辦法迴避或者改進?
mathematica 能 批量生成自定義函數嗎 幫助都翻破了 找不到解決方法?
除了專業領域外,Mathematica 在日常生活有什麼有趣用處?

TAG:WolframMathematica | 編程 | 自然科學 |