meshgrid

3次元プロットのための配列 X と Y(ヘルプより)

3次元のグラフを描くときによく使われるコマンドですが、PTBでは、例えばガウス分布を作るときに使われたりします。少し分かりにくいコマンドですが、使いこなせるようになると便利なコマンドのひとつです。

次のコマンドを実行してみてください。

a=[-3:1:3]
b=[-5:1:5]
[x, y]=meshgrid(a, b)

x, yの値を見るとmeshgridが何をしているのかが分かるのではないかと思います。

xは、ベクトルaを、bの要素の数(11)だけ行として並べたものです。

同様に、yは、ベクトルbを、aの要素の数(7)だけ列として並べたものです。

それでは応用として、z=x+yのグラフを見てみましょう。

z=x+yのグラフを見るサンプルプログラムを以下に記します。グラフは矢印(3-D 回転)をクリックすることによって、いろんな角度から見ることができます。

a=[-3:1:3]
b=[-5:1:5]
[x, y]=meshgrid(a, b)
z=x+y
%グラフ化(以下の3行のいずれでもよい)
%plot3(x, y, z)
%mesh(x, y, z)
surf(x, y, z)
% グラフの軸のラベル
xlabel('x')
ylabel('y')
zlabel('z')

次に、ガウス分布を描くプログラムです。基本的には上記のプログラムと同じですが、ベクトルa, bの要素数が変わっていたり、変数s, tが追加されています。sやtの値を大きくしたり小さくしたりしてみて、グラフがどのように変化するかを見てみると勉強になるかと思います。

a=[-5:0.2:5];
b=[-5:0.2:5];
s=3;
t=3;
[x, y]=meshgrid(a, b);
z=exp(-((x/s).^2)-((y/t).^2));
%グラフ化(以下の3行のいずれでもよい)
%plot3(x, y, z)
%mesh(x, y, z)
surf(x, y, z)
% グラフの軸のラベル
xlabel('x')
ylabel('y')
zlabel('z')
%グラフのタイトル
title('Gaussian Distribution')

ガウス分布に関する補足

exp(指数関数)は単調増加(減少)関数なのに、どうしてガウス分布のように釣鐘形になるのだろうと思ったことはないでしょうか。Matlabでちょっとグラフを書いてみましょう。

青がexp(-x)のグラフ、緑がexp(-x.^2)のグラフです。前者は単調減少関数ですが、後者は釣鐘の半分の形になっていますね。(-x.^2)は、(-x)の2乗ではなく、xの2乗のマイナスであることに注意してください。

ここで、x = 0.6 の場合を考えてみましょう。x^2(Xの2乗)は0.36です。つまり、x = 0.6 のときのexp(-x.^2)の値と、x = 0.36 のときのexp(-x)の値は同じ値になるはずです。グラフを見てもそうなっていますね。

ポイントは、0 < x < 1のときは、xの2乗はxの値よりも小さくなる、ということです。(x > 1のときは、xの2乗はxの値よりも大きくなります)その結果、0 < x < 1の範囲内では、exp(-x.^2)のグラフはexp(-x)のグラフが横方向に膨らんだような形になるのです。

最後に上のグラフを描くプログラムを書いておきます。plotコマンドは複数行に分けて書いています。複数行に分かれるときは、行末に ... をつけます。

x=[0:0.1:2];
s=[0:0.01:1];
t=[0:0.01:2];
plot(x, exp(-x), ...
    x, exp(-x.^2), ...
    0.36, s, ...
    0.6, s, ...
    t, exp(-0.36))
legend('exp(-x)', 'exp(-x.^2)')
xlabel('x')
ylabel('y')