mesh 和 surf 是三度空間立體繪圖的基本指令,mesh 可畫出立體的「網狀圖」(Mesh Plots),surf 則可畫出立體的「曲面圖」(Surface Plots),兩者產生的圖形都會依高度而有不同顏色。下列範例畫出一個二維矩陣的立體網狀圖:
在上述範例中,X 軸對應到矩陣 z 的直行索引,Y 軸則對應到橫列索引,換句話說,在上述圖形中,當 x = j 且 y = i 時,所對應的高度是 z(i, j),可以驗證如下:
若要將與曲面對應的 x 座標和 y 座標都一併畫出來,還是可以使用 mesh 指令,例如我們可以畫出曲面 $z=xy$ 在 $x \in [3, 6]$ 及 $y \in [5, 9]$ 的網狀圖:
在上述範例中,meshgrid 的作用是產生 x 及 y (均為向量) 為基準的格子點 (Grid Points),其輸出為 xx 及 yy(均為矩陣),分別代表格子點的 x 座標及 y 座標。
在下列範例中,我們使用 linspace 來產生較密集的資料,以便畫出由函數 $z=xe^{-x^2-y^2}$ 形成的立體網狀圖:
surf 和 mesh 指令的用法類似,但產生的圖形是立體曲面圖:
為了方便測試立體繪圖,MATLAB 提供了一個 peaks 函數,可產生一個凹凸有致的曲面,包含了三個局部極大點(Local Maxima)及三個局部極小點(Local Minima),其方程式為:
$$
z=3(1-x)^2e^{-x^2-(y+1)^2}-10(\frac{x}{5}-x^3-y^5)e^{-x^2-y^2}-\frac{1}{3}e^{-(x+1)^2-y^2}
$$
要畫出此函數的最快方法,即是在 MATLAB 命令視窗直接鍵入 peaks,可得到下列方程式與圖形:
我們亦可對 peaks 指令取點,再以各種不同方法進行繪圖,相關細節可由「help peaks」而查到線上支援。
meshz 指令有將曲面加上「圍裙」或「舞台」的效果:
waterfall 指令可在 x 方向或 y 方向產生水流效果:
meshc 可同時畫出網狀圖與「等高線」(Contours):
surfc 可同時畫出曲面圖與等高線,而 contour、contourf、contour3 等指令則可畫出不同呈現方式的等高線,可詳見第五章「特殊圖形」的說明。
plot3 指令可畫出三度空間中的曲線:
亦可同時畫出兩條三度空間中的曲線:
如果輸入引數是三個大小相同的矩陣 x、y、z,那麼 plot3 會依序畫出每個行向量在三度空間所對應的曲線,如下:
在上例中,所有的資料點都必需是在格子點上,MATLAB 才能根據每點的高度來作圖。如果所給的資料點不在格子點上,我們必需先用 griddata 指令來進行內插法以產生格子點,例如:
其中 x、y、z 代表資料點(或取樣點),而 X、Y、Z 則代表根據資料點進行內插法所得到的格子點,以畫出上面的網狀圖。有關於曲線及曲面的內插,可參見本書姊妹作「MATLAB 程式設計:進階篇」第九章「內差法」。
以下是基本三維立體繪圖指令的列表:
| 類別 | 指令 | 說明
|
|---|
| 網狀圖 | mesh, ezmesh | 立體網狀圖
|
| meshc, ezmeshc | 網狀圖加上等高線
|
| meshz | 網狀圖加上“圍裙”(或“舞臺”)
|
| 曲面圖 | surf, ezsurf | 立體曲面圖
|
| surfc, ezsurfc | 曲面圖加上等高線
|
| surfl | 曲面圖加上光源
|
| 曲線圖 | plot3, ezplot3 | 立體曲線圖
|
| 低階函數 | surface | surf 用到的低階指令
|
| line3 | plot3 用到的低階指令
|
| 等高線 | contour, ezcontour | 平面上的等高線
|
| contour3 | 空間中的等高線
|
| 影像表示 | pcolor | 在二維平面中以顏色表示曲面的高度
|
如果我們只是要很快地檢視一個具有二個輸入的函數的圖形,就可以使用 ezmesh 或是 ezsurf 等來快速地畫出函數的曲面圖形,例如:
很難想像這些簡單的函數可以產生如此複雜的曲面吧?
MATLAB程式設計:入門篇