H..1 2変数関数のグラフの鳥瞰図 mesh(), meshc(), surf(), surfc()

2変数関数のグラフの鳥瞰図を線画で描くには、 mesh() という関数を使う。 meshc() は同時に等高線も描く。

シェーディングされた面の集まりとして描くには、 surf(), surfc() を使う。

  • mesh(X,Y,Z) のように使う。
  • Z は 2 次元配列であるが、 関数 $ f$ のグラフを描く場合、 Z(j+1,i+1) $ f(x_i,y_j)$ を収めるというのが味噌。
  • XY は1次元配列 (それぞれ X(i+1)=$ x_i$ , Y(j+1)$ =y_j$ ) の場合も、 2次元配列 (それぞれ X(j+1,i+1)$ =x_i$ , Y(j+1,i+1)$ =y_j$ ) の場合もある。 後者は meshgrid() で作るのが簡単。
  • meshgrid() の使い方。
    $ [a,b]\times[c,d]$ の各辺を m, n 等分するグリッドを作る
      [X,Y]=meshgrid(a:(b-a)/m:b,c:(d-c)/n:d);
    
    size(meshgrid(a:(b-a)/m:b,c:(d-c)/n:d)) とすると、 [n+1 m+1] という結果が返ってくる。 $ a=0$ , $ b=5$ , $ c=0$ , $ d=3$ , $ m=5$ , $ n=6$ の場合、 7行6列の行列が返る。
    >> a=0;b=5;c=0;d=3;m=5;n=6;
    >> size(meshgrid(a:(b-a)/m:b,c:(d-c)/n:d))
    ans =
          7   6
    >> [X,Y]=meshgrid(a:(b-a)/m:b,c:(d-c)/n:d)
    X =
    
         0     1     2     3     4     5
         0     1     2     3     4     5
         0     1     2     3     4     5
         0     1     2     3     4     5
         0     1     2     3     4     5
         0     1     2     3     4     5
         0     1     2     3     4     5
    
    
    Y =
    
             0         0         0         0         0         0
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        1.0000    1.0000    1.0000    1.0000    1.0000    1.0000
        1.5000    1.5000    1.5000    1.5000    1.5000    1.5000
        2.0000    2.0000    2.0000    2.0000    2.0000    2.0000
        2.5000    2.5000    2.5000    2.5000    2.5000    2.5000
        3.0000    3.0000    3.0000    3.0000    3.0000    3.0000
    

素朴な発想?
% [-2,2]×[-1,1] で x^2-y^2 のグラフを描く
nx=50;
ny=40;
hx=4/nx;
hy=2/ny;
X=-2:hx:2;
Y=-1:hy:1;
Z=zeros(ny+1,nx+1);
for i=0:nx
    x=-2+i*hx;
    for j=0:ny
        y=-1+j*hy;
        Z(j+1,i+1)=x^2-y^2;
    end
end
clf
mesh(X,Y,Z)

MATLABらしい書き方?
nx=50;
ny=40;
hx=4/nx;
hy=2/ny;
[X,Y]=meshgrid(-2:hx:2,-1:hy:1);
Z=X.^2-Y.^2;
clf
mesh(X,Y,Z)

図 6: $ z=f(x,y)=x^2-y^2$ のグラフの鳥瞰図
\includegraphics[width=13cm]{eps/test2.eps}

mesh(), meshc(), surf(), surfc() の違いを見ておこう。

図 7: グラフの鳥瞰図 (mesh())
\includegraphics[width=\hsize]{eps/testmesh.eps}
図 8: グラフの鳥瞰図 (meshc())
\includegraphics[width=\hsize]{eps/testmeshc.eps}

図 9: グラフの鳥瞰図 (surf())
\includegraphics[width=\hsize]{eps/testsurf.eps}
図 10: グラフの鳥瞰図 (surfc())
\includegraphics[width=\hsize]{eps/testsurfc.eps}

桂田 祐史
2017-06-19