* 今回の記事はコマンドによる操作の多い記事になっています。あらかじめご了承ください。

前回の記事は Vector/Arrow Plot でした。その最後に、"ベクトルプロットは頻繁に描くタイプのプロットではありませんが、覚えておくときっといいことがある、かもしれません。" と書いておきながら、申し訳ありませんが、今回も Vector/Arrow Plot でお届けします

勾配といえばベクトル解析。僕は大学でベクトル解析に触れたあたりから、数学と縁遠くなってしまった気がします。ほんと勉強した記憶がないのですが、そんな記憶を振り絞って書くと、スカラー量 ψ の勾配を grad ψ(あるいは ∇ ψ) と書くんだったはず。

ig_vector_plot_1

grad とか ∇(ナブラ)みると、ちょっと身構えたくなりますが、小難しい話は今回の記事はここまです。つまり勾配は、各方向に微分してあげたベクトルになるってことまでで OK です。例えば、2次元グリッドで高さのデータが与えられれば、高さを、x方向とy方向で微分して得られるベクトルは、勾配になりますよね。今回はつぎの(模擬的な)標高データのプロットに勾配をベクトルプロットしてみようと思います。

ig_vector_plot_2
Fig.1 サンプルデータ



RealisticData



なお、このデータは、IGOR Pro のサンプルエクスペリメント Contour Demo.pxp に収録されてある RealisticData という2次元のウェーブです。

▼ [おさらい] IGOR Pro で微分

IGOR Pro の Differentiate 操作関数を使うと、ウェーブ(データ)を任意の方向に微分できます。

Differentiate /Dim=d sourceWave [/D=destinationWave]

sourceWave が微分するウェーブ、destinationWave が出力(適用先)ウェーブです。d は微分する方向を指定します。行(x)方向は /Dim=0、列(y)方向は /Dim=1などと指定します。出力(適用先)ウェーブの指定はオプションですが、指定しないと元のウェーブを問答無用に上書きしてしまいますので、出力先(適用先)ウェーブを指定したほうが無難だと思います。

▼ 実際に微分してみると

冒頭で紹介したウェーブを微分してみます。

Differentiate /Dim=0 RealisticWave /D=DiffRow
Differentiate /Dim=1 RealisticWave /D=DiffCol

行方向(x)の微分は、xの値が小さいほうから大きいほうへ(左から右へ)、列方向(y)の微分はyの値の小さいほうから大きいほうへ(下から上へ)それぞれ行われます。微分で得られた値がプラスの場合を、マイナスの場合をでプロットしてみました。

ig_vector_plot_3ig_vector_plot_4
Fig.2 x方向の微分Fig.3 y方向の微分


y=-1 にある山の部分を見てください。、X方向の微分(Fig.2)は山の尾根にそって下っていく方向にあたりますので、次第に青色が濃くなっています。一方、Y方向の微分(Fig.3)は下側から山に登って行って(微分が正=赤)、尾根のところでY方向の微分がほぼゼロ(=白)になって、尾根を越えると山を下るので微分は負(=青)になっていることが分かると思います。ちゃんと微分できているようですね。


▼ ベクトル情報に変換

RealisticData は縦横50ポイントのウェーブです。微分したウェーブも縦横50ポイントありますので、このプロット上に、50x50=2500個の矢印を描くことができますが、それはさすがに多すぎます。少し間引いてあげた方がよさそうですね。

例えば、5ポイントごとに間引くのはこんな方法が使えます。

Make/O/N=(10,10) subDiffRow, subDiffCol
subDiffRow[][]=DiffRow[5*p][5*q]
subDiffCol[][]=DiffCol[5*p][5*q]

まず Make 操作関数で間引いた後のウェーブ(縦横10ポイント)を生成して、2行目と3行目でウェーブを割り当てています。ここで登場する pq はウェーブの演算でのみインデックスを返す特殊な演算子です。

次は、間引いたデータから長さ(Len)と角度(Rad)を計算する必要があります。まず長さ Len は、

Make/O/N=(10,10) Len
Len = Sqrt(subDiffCol^2+subDiffRow^2) * 1.5

と二乗平均を計算すれば、ひとまず良さそうです。最後に1.5倍しているのは、ベクトルをほどよい長さにするための補正で、ケースバイケースの値です。


一方角度 Rad は、微分のx成分とy成分から角度を得る必要がありますので、atan2 関数が良いですね。

Make/O/N=(10,10) Rad
Rad = atan2(subDiffCol, subDiffRow) + pi

Rad に pi (=π)を加えているのは、傾斜を下る方向に矢印を向けるための補正です。

長さ Len と角度 Rad はまだ Z マトリクスですが、最終的には全ポイント(ここでは100ポイント)を縦に並べて、1列目に長さ、2列目に角度を持つ2次元ウェーブ Arrow を用意する必要があります(詳しくは、前回の記事やヒューリンクスのサポートページを見てください)。

Z マトリクスから1次元のウェーブに変換するにはマクロ MatrixToXYZTriplet を使うと便利です。プロシージャウィンドウの冒頭に

ig_vector_plot_5
Fig.4 プロシージャファイル(MatrixToXYZ)のロード

と入力してコンパイルすると、マクロメニューからマクロが利用できるようになります。

ig_vector_plot_7
Fig.5 マクロ MatrixToXYZTriplet

マクロ MatrixToXYZTriplet を使って、長さ Len と角度 Rad のトリプレットウェーブ Len1d と Rad1d を作成し、3列目に得られる長さと角度のデータ並んだ列だけを合体させて、ウェーブ Arrow を作ります。

MatrixToXYZTriplet("Len","Len1d",2)
MatrixToXYZTriplet("Rad","Rad1d",2)

Make/O/N=(100,2) Arrow
Arrow[][0] = Len1d[p][2]
Arrow[][1] = Rad1d[p][2]

ここでもインデックスを返す関数 p を使って、Arrow を合成しています。


▼ 仕上げ

もう少しです。肝心な、勾配を示す場所を与えるXデータ(ArrowX)とYデータ(ArrowY)を計算するのを忘れていました。もとの RealisticData のXとYの範囲はいずれも -3~2.88 (間隔は 0.12)です。この情報は RealisticData というウェーブのウェーブスケーリングとして保持されているわけですが、間引いたデータを作成した時にこのウェーブスケーリングは失われてしまいます。いろいろやり方はありますが、-3 から始まって間隔が5倍(0.12×5 = 0.6)のウェーブを合成するのが一番簡単そうです。

Make/O/N=100 ArrowX, ArrowY
ArrowX[] = -3 + 0.6 * Len1d[p][0]
ArrowY[] = -3 + 0.6 * Len1d[p][1]


さぁ、アイテムはそろいました。最初のイメージプロットにベクトルを重ねるとこんな感じになります。うまくいきました。

ig_vector_plot_6
Fig.6 完成図


▼ まとめ

高さのデータから勾配を計算してベクトルプロットで表示してみました。今回の操作はコマンドが多くてわかりづらかったかもしれません。実は微分の操作は、解析メニュー>微分でも同様の操作が可能です。しかしそれ以降の操作は、コマンドを使ったほうがきっと早いはずです。

--
井上@技術部でした。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/446
内容に対しての関連性がみられないものは削除する場合があります

コメント一覧

KaleidaとIgor proのユーザーです。今回はたいへん参考になりました。
ただし、学生も当方も、はるかに基礎的なことでつまずいています。なにしろIgor proは選択枝が多い。

できるなら、Waveの作成→グラフ、グラフ整形、マルチピークフィッティングなど、それぞれ一本道の手順書を表していただけると助かります。
またこれはmac userとしての希望ですが、グラフファイルのQuick Lookが欲しいですね。Igor Proのエクペリメントは難しいでしょうが、KaleidaGraphのqpcファイルなら何とかなりません?

bemybaby さん、コメントありがとうございます。

> できるなら、Waveの作成→グラフ、グラフ整形、マルチピークフィッティングなど、それぞれ一本道の手順書を表していただけると助かります。

→IGOR Pro は操作の自由度が高いことが売りの製品ですので、どちらかというと一本道の操作というのは、苦手です。例えば、Wave の作成~グラフ整形に関しては、製品付属の Getting Started あるいは、弊社ウェブページの記載がご参考になるのではないかと思います。
http://www.hulinks.co.jp/support/igor/gs.html

また、マルチピークフィッティングは、バージョン6.1で刷新されています。この内容についても弊社ウェブには少し記載があります。併せてご覧ください。
http://www.hulinks.co.jp/support/igor/multipeakfit.html


> またこれはmac userとしての希望ですが、グラフファイルのQuick Lookが欲しいですね。

→開発元によって、この機能が実装されることは保障することはできませんが、ユーザさまからの要望として開発元にお伝えするようにいたします。貴重なご意見ありがとうございました。

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報