利用 Gnuplot 軟體繪製似氫原子的軌域形狀(上)

Print Friendly

利用 Gnuplot 軟體繪製似氫原子的軌域形狀(上)(Hydrogen-like orbital plots using gnuplot (I))
國立臺灣師範大學化學系兼任教授 邱智宏

高中或大學化學課程,每當遇到物理化學領域時,原子軌域、波函數 (wave function)、機率密度 (probability density) 等,對一般學子而言就一個抽象了得!連課本中軌域的形狀是怎樣畫出來的也是丈二金剛,摸不著頭腦,既使知道怎麼畫出來的,也找不到適當的軟體,親自體驗一下。專業軟體如 maple、 mathematic 不是太貴,就是太複雜,簡易軟體如 excel,又不符需求,因此這一單元的教材,由於缺乏具體的圖像及做中學的體驗,往往是學子學得較不理想的部分。

最近發現在網路上一直頗為熱門的 gnuplot 繪圖軟體,它是一套跨平臺、小而美、免費的自由軟體,廣泛的應用在各科的學術領域中。國內、外的網站也多有介紹,包括繪製地形地貌、設計統計圖表、展示 3D 圖像的數學函數等,論述不在少數,唯在化學領域的部分,則較少人提及,本文擬以繪製似氫原子的軌域 (hydrogen-like orbital) 形狀為主題,一邊介紹 gnuplot 的使用方法,一邊演示如何透過它畫出軌域的具體形象,提供學子從做中學的經驗和樂趣。

一、gnuplot 簡介

Gnuplot 軟體所佔空間很小,不到 3 Mega,可以直接到其官方網站 (http://gnuplot.info/) 下載 window 的版本。該壓縮檔經成功下載、解壓縮及安裝以後,便可在程式集中選擇 gnuplot 程式並開始執行,此時會有如圖一的一個小視窗跳出。對於熟悉早期 DOS 系統的讀者,對於這種界面一定會覺得格外的親切。小視窗的螢幕中,其最下方一行會出現右列文字:gnuplot>_,有一個閃爍的游標在等待指令輸入。當然不熟悉 DOS 的讀者也勿須擔心,因為下拉式選項的 window 版本也都同時一應俱全。

71276_p1

圖一、gnuplot 的視窗,可在游標閃爍處輸入指令以進行繪圖,或由下拉式選項進行操作(圖片來源:作者製作)

此時先在如圖一的畫面中輸入二道指令,第一個為 set isosample 50,50,設定 isosample,即代表設定在立體圖形中每一條繪圖線被描點的細緻程度,數值愈大圖形愈細緻,若不設定,其內定值為 20,20。第二個指令為 set hidden3d,即設定畫 3D 圖形時,被前面圖形檔住的部分隱藏而不顯現,當然也可以設定為 unset hidden3d,代表可以不受前面圖形的阻檔而直接透視,讓二者都被看見。但是輸入這二個指令後,好像螢幕完全没有反應,此乃尚未正式輸入繪圖指令的緣固,其效果無法顯現。接著若想要繪出下列方程式的 3D 圖形:

$$\displaystyle f(x,y)=\frac{\sin(\sqrt{x^2+y^2})}{\sqrt{x^2+y^2}}$$

此時在游標列上輸入:splot sin(sqrt(x**2+y**2))/sqrt(x**2+y**2),在 gnuplot 的語法中,splot 為繪製 3D 圖形的指令(而平面圖形則需使用 plot),**代表次方、sqrt() 代表開平方,其他如加、減、乘、除,即以大家所熟悉的 +、-、*、/ 表示。當我們按下 enter 時,即跳出另一視窗,將繪製好的圖形顯示如圖二。

71276_p2

圖二、利用 gnuplot 畫出 $$f(x,y)=\frac{\sin(\sqrt{x^2+y^2})}{\sqrt{x^2+y^2}}$$ 的 3D 圖形(圖片來源:作者製作)

圖二出現高低起伏、深淺得宜的 3D 圖形,其與量子化學中有關似氫原子的軌域形狀頗有相似之處。讀者或許會很奇怪為何簡單的幾個指指令,就能繪出如此複雜的圖形?

事實上這就是 gnuplot 軟體功能強大的所在,它會自動幫你定義合適的 $$x$$、$$y$$ 範圍,然後將 $$(x,y)$$ 相對應的每一點,代入上列函數中算出 $$f(x,y)$$ 的大小,即為 $$z$$ 座標的大小,然後根據 $$(x,y,z)$$ 的座標將圖形一點一點的描繪出來。當然你也可以自行定義 $$x$$,$$y$$ 及 $$z$$ 軸的範圍、圖形的解析度、觀看圖形的視角、座標軸的名稱及圖形的標題等,這正是我們接下來要學習的一部分。

在 gnuplot 的視窗中每次輸入一行指令,對於要設定許多條件的使用者,似乎很不方便,因此也可以使用類似 window 中的記事本,將所有的指令一行一行的編緝妥當後,再儲存成文字檔,如圖三檔名為 fourier.txt 的指令集即為一例。

71276_p3

圖三、利用 window 的記事本將 gnuplot 的指令編寫成一個文字檔 (.txt) (圖片來源:作者製作)

圖三的文字檔以 fourier.txt 存檔後,可在 gnuplot 視窗的游標列上輸入:load “fourier.txt”,讓 gnuplot 讀取檔案後,一次執行一系列的指令以完成任務,當然讀取檔案的路徑必須正確,若不正確則無法順利執行。當內定路徑無法找到檔案時,可利用視窗中 ChDir 的下拉式選項改變讀取檔案的路徑。

圖三的指令集只是一個示範,初學者肯定看不懂,經過一段時間的練習,或許便能達到此出神入化的境界,其中比較困難的指令先略而不談,挑較簡單的部分說明如下:第 $$1$$ 行的 reset 指令是將先前定義過的各項設定還原為預設值,這一點在編緝指令集時很重要,不要忘了在第一行加入這個指令,因為使用者經常會忘記先前下過那些指令,如果没有 reset,難保不會出現不可預期的結果。第 $$2$$ 行的 multiplot,是在同一個視窗(即畫布)中畫出多個 2D 圖形,如果没有設定 multiplot,當下達 plot 指令時只能繪製單個圖形(畫 3D 則使用 splot)。set multiplot layout 2,2,即表示在同一個畫布中畫出二行二列共 $$4$$ 個圖形。

接下來的指令集屬於函數設定及程式控制,程式控制屬於較高階的技巧,我們暫時不會用到,請大家不用擔心,只要經過一段時間的練習,便能駕輕就熟。其大意是做 $$4$$ 次不同階層的傅立葉轉換 (fourier transform),其結果如圖四。

71276_p4

圖四、使用 multiplot 指令畫出多個 2D 的傅立葉轉換圖形(作者製作)

連結:利用 Gnuplot 軟體繪製似氫原子的軌域形狀(下)


參考文獻

  1. gnuplot homepage. http://gnuplot.info/
  2. 地圖/統計圖/3d 函數圖/實驗報告圖 — Gnuplot 純畫圖|”資訊人權貴” 之家。 http://user.frdm.info/ckhung/b/ma/gnuplot.php
  3. gnuplotスクリプトの解説|米澤進吾 ホームページ http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/index.html
  4. 马欢 (2012)。使用 gnuplot 科学作图|Gnuplot 中文教程。 http://www.phy.fju.edu.tw/files/archive/876_ab57aed9.pdf
  5. N. Levine (2008), Physical Chemistry (6th ed.). McGRAW-HILL Book Company. p637~647.
  6. Spherical to Cartesian Coordinates Calculator – Learning about Electronics. http://www.learningaboutelectronics.com/Articles/Spherical-to-cartesian-rectangular-coordinate-converter-calculator.php
  7. Saputra, A., Canaval, L. R., Fadiawati, N., Diawati, C., Setyorini, M., Kadaritna, N., & Kadaryanto, B. (2015). Visualizing Three-Dimensional Hybrid Atomic Orbitals Using Winplot: An Application for Student Self Instruction. Journal of Chemical Education, 92(9), 1557-1558.
  8. Chung, W. C. (2013). Three-dimensional atomic orbital plots in the classroom using Winplot. Journal of Chemical Education, 90(8), 1090-1092.
  9. Moore, B. G. (2000). Orbital Plots Using Gnuplot. Journal of Chemical Education, 77, 785-789.
  10. 葉名倉、劉如熹、邱智宏、周芳妃、陳建華、陳偉民(2013 年)高級中學化學選修上冊。南一書局。第14~26頁。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *


+ 2 = 8