GMTで描こう Part 3: gmtmath

gmtmathモジュール

 本稿ではGMT6のgmtmathについて解説します。このモジュールは数学的な演算データテーブルに対して施すという機能を持っています。よく似た名前のモジュールにgrdmathがありますが、こちらはnetCDFのグリッドファイルを扱うという点で異なります。(なお、シェル上で実行する際にはgmt mathとスペースを入れて入力するのでmathと呼ぶ方が良いかもしれませんが、Documentationの表記に従ってgmtmathとします。)

 gmtmathはテーブルを入力として受け取り、または実行時にテーブルを生成して、指定された演算を各行に実行し、結果に出力します。演算指示を与えるには逆ポーランド記法の構文を使います。

逆ポーランド記法

 逆ポーランド記法(Reverse Polish Notation, RPN)は、数式の記述方法の一つで、演算子(operator)を被演算子(オペランド、operand)の後ろに置く表記法です。この特徴から後置記法 (Postfix Notation) と呼ばれることもあります。通常の記法による数式の

2 + 3

は、逆ポーランド記法では

2 3 +

となります。より複雑なものになると、

(a + b) / (c - d)

は、

a b + c d - /

となります。このように逆ポーランド記法では式の評価順序を指定する括弧が不要となります。この特徴はコンピューターに計算を指示する際に都合がよく、単純な処理で計算を実行できます。

gmtmathの使い方

基本的な使い方

以下のような、2列のファイルdat.txtを用意します。

$ cat dat.txt
1   1
2   2
3   3
4   4
5   5

このファイルを入力とし、各行2列目の数値を10倍にして標準出力するコマンドは次のようになります。

$ gmt math dat.txt 10 MUL =
1   10
2   20
3   30
4   40
5   50

 入力のdat.txtと定数10はオペランドで、MULは乗算の演算子です。逆ポーランド記法で表記するので、演算子はオペランドの後ろに来ています。この例のようにgmtmathで使う演算子はすべて大文字の英字です。四則演算+ - * /はそれぞれ、ADD, SUB, MUL, DIVとなります。他にも様々な数学関数が100以上用意されています(三角関数、指数関数、双曲線関数 etc. 詳しくはDocumentationを参照してください)。末尾は出力先指定で、=のみの場合は標準出力になります。= filenameのようにすることで、計算結果をファイルに保存できます。

 なお、オペランドにはテーブルファイル(ASCII)、定数、予約されたシンボル(PI, E, T(後述)など)を指定できます。入力として複数個のテーブルファイルを与えて計算することも可能です。

テーブルを生成する

 入力ファイルを用意しなくても、-Tオプションを使えばその場でテーブルを用意できます。

$ gmt math -T0/360/5 T SIND =
0	  0
5	  0.0871557427477
10	0.173648177667
15	0.258819045103
20	0.342020143326
25	0.422618261741
30	0.5
35	0.573576436351
...

-Tのその引数に(始点)/(終点)/(増分)のような形式で与えることで、数値のテーブルを得ることができます。上の例では、0から360までを5の間隔で出力するように命令しています。その後ろのTはオペランドで、生成した数値のテーブルそれ自身を示します。SINDは度数法の正弦関数を意味する単項演算子です。

三角関数をプロットしてみる

 gmtmathで得られた結果は、パイプラインで直接別のコマンド・モジュールに渡すことができます。以下のシェルスクリプトでは、結果をplotモジュールに渡して三角関数を描画しています。

#!/bin/bash
range=0/360/5
gmt begin sin_cos png
   gmt basemap -JX10c/7c -R0/360/-1.1/1.1 -Bxa90g90f30+u@. -Bya0.5f0.1g1 -BWeSn
   gmt math -T$range T SIND = | gmt plot -W1p,red -l"sin"
   gmt math -T$range T COSD = | gmt plot -W1p,blue -l"cos"
   gmt legend -DjBL+jBL+o0.5/0.5 -F+pblack+gwhite
gmt end show

番外編:1列テーブルを作成する

 -oオプションを使うと出力する列を絞ることができます。-o0とすると1列目のみを、-o1とすると2列目のみを出力します。以下では後者を指定することで、演算された結果のみのテーブルを出力しています。

$ gmt math -o1 -T0/10/2 T 100 MUL =
0
200
400
600
800
1000

まとめ

  • gmtmathはデータテーブルを入力にして、数学的な操作を各行に施した結果を出力します。
  • その操作は逆ポーランド記法で指定します。指定された演算はすべての行に対して実行されます。
  • 出力した結果をパイプラインで渡して、plotすることができます。

 このモジュールは、演算子を組み合わせることで様々なグラフを描画できます。プログラムを書くほどではないが、awkで書くのは面倒な処理に向いているのではないでしょうか。またアニメーションを作る際に必要なデータテーブルを用意するのにも有用だと思います。

 アニメーションを作るmovieモジュールや、上の図を作るのに使った凡例を表示するlegendモジュールについては、今後記事を書く予定です。

参考文献

  1. gmtmath — GMT 6.2.0rc1 documentation
  2. 逆ポーランド記法 – Wikipedia
  3. 逆ポーランド記法について

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

GMTで描こう Part 2: plot