Gnuplot 十分鐘的 3d 曲面奇航


請安裝 gnuplot 並下指令 gnuplot 進入其命令列。 Windows 用戶: 下載 gnuplot 其中的 gp???win32.zip 版, 解壓縮, 執行 bin/wgnuplot.exe。 從進入 gnuplot 之後開始算起, 請給我十分鐘 (到第二節為止), 讓你看看 3d 數學曲面之美。 操作完這篇之後, 或許你會想認真 學 gnuplot and 認真學多變數函數與微分幾何。

各種設定

馬鞍面, 附等高線與著色 請逐句分開剪貼, 逐步觀察每一個指令的效果。

        splot x*x - y*y         # 馬鞍面
        # 請用滑鼠拉著圖形轉一下
        set isosamples 20,20    # 提高畫線密度; 下一次畫圖時才看得見效果。
        replot                  # 重畫
        set hidden3d            # 消除隱線;  下一次畫圖時才看得見效果。
        replot                  # 注意: 現在曲面正面和背面的顏色不一樣了。
        set contour             # 畫等高線。
        replot
        set cntrparam levels 20 # 提高等高線密度。
        replot
        set pm3d                # 按照高度著色。
        replot
        reset                   # 清除所有設定, 恢復成預設值。
        replot                  # 回復成第一次畫圖的樣子。
        

欲知詳請, 請下 help 指令。 例如等高線也可以畫在曲面身上 (而不是畫在底盤) -- 詳見 help set contour

曲面方程式集錦

兩個二次極限存在但不相等, 所以二重極限不存在 請設定好你的偏好 (isosamples, hidden, contour, pm3d, ... 等等), 然後逐一嘗試 splot 以下函數。

  1. sin(x)/x*y*y
  2. (x*x-y*y)/(x*x+y*y) 這個曲面在 (0,0) 的地方, 兩個 「二次極限」 存在但不相等, 所以 「二重極限」 不存在。
  3. 先定義一個函數: sinc(x)=sin(x)/x 然後再把它旋轉出來的立體曲面: sinc(sqrt(x*x+y*y)) 用 splot 指令畫出來。

sinc 函數的旋轉曲面 接下來用參數式畫一顆球:

        set parametric          # 進入參數式模式。
        splot cos(u)*cos(v), cos(u)*sin(v), sin(u)
        unset pm3d              # 著色模式怪怪的; 取消!
        replot                  # 線條間隔怪怪的?
        splot [-pi:pi] [-pi/2:pi/2] cos(u)*cos(v), cos(u)*sin(v), sin(u)
        

畫球的時候, 預設 u 與 v 的參數值變化範圍是 -5 到 5, 所以線條的間隔怪怪的 (從 -3.14 到 3.14 繞了一圈之後, 第二圈畫線的位置就亂掉了...) 最後一個指令改將 u 的範圍限制在 -3.14 到 3.14 之間, v 的範圍限制在 -1.57 到 1.57 之間。

分不出正反面的 Moebius Strip 注意: 參數式模式下, 變數是 u 與 v (而不再是 x 與 y), 且 splot 後面要有三個函數, 分別代表 x,y,z 座標。 以下的函數都在參數式模式底下繪畫。

  1. 八面粽: [-pi:pi] [-pi/2:pi/2] (cos(u)*cos(v))**3, (cos(u)*sin(v))**3, sin(u)**3
  2. 甜甜圈: [-pi:pi] [-pi:pi] cos(u)*(R+cos(v)), sin(u)*(R+cos(v)), sin(v)
  3. 螺旋面: [0:3*pi] [0:1] v*cos(u),v*sin(u),u
  4. 分不出正反面的 Moebius Strip: [0:2*pi] [-1:1] cos(u)+v*cos(u/2)*cos(u),sin(u)+v*cos(u/2)*sin(u),v*sin(u/2)

pm3d 的調色盤

在 pm3d 模式下, 其實可以用 set palette 指令, 自己設定調色盤。 每次 gnuplot 要畫一小塊四邊形時, 就會用那一小塊的 z 值 (其實是四個頂點垂直高度的平均值) 去查閱你所設定的調色盤。 它會將 z 值存在一個變數 gray 裡面, 用你給的公式去計算出紅藍綠的成分。 它給你的 gray 變數, 數值保證介於 0 與 1 之間, 0 表示曲面最低點, 1 表示曲面最高點。 你給它的紅藍綠值, 數值也必須介於 0 與 1 之間。 例如:

HSV 色彩圓錐 我則偏好採用 HSV 方式指定顏色。 右圖取自 維基百科。 想像一個圓錐體, 最底下是黑色; 軸心是不同明暗度的灰色; 最上面 (也是最亮的一片橫切片) 的圓心是白色, 而外環則是色彩最鮮艷的一圈。 用三個數值, 可以定位出色彩圓錐當中的一個點: Hue 選定色相 (某個縱切片直角三角形); Saturation 選定彩度 (距離軸線有多遠? 以百分比表示); Value 選定明度 (某個橫切片圓形)。