Matlab パッケージの概要
使い方
Matlab[function](args)
function(args)
|
説明
|
|
•
|
Matlab パッケージに含まれているコマンドを使用するには、長い形式と短い形式を使用しコマンドを使用することができます。
|
•
|
Matlab ライブラリーをうまく呼び出すには Matlab リンクをサポートしているプラットフォームで、パス上にライセンスを受けた Matlab の実行ファイルがないといけません。詳しくは Configuring a Computer for Matlab を参照して下さい。1度ライブラリー関数を呼び出せば、 Maple セッションでそれらを組み合わせて Matlab 中でそれらを実行することも可能です。 Matlab セッションからあるいは Matlab セッションへ双方向にデータをやり取りすることができます。
|
•
|
以下の 2 種類の行列の違いを理解しておく事が重要で、 Matlab 関数の呼び出しでは両方を使うことができます。
|
|
(1) MatlabMatrix - 文字列は通常 Matlab で定義された変数の名前を表します。例えば、コマンド Matlab[inv]("M") は Matlab で定義された変数 M の逆行列を計算します。変数 M が Maple 側でも定義されていても、この呼び出しはそれに影響しません。2つの呼び出し、Matlab[det](M) と Matlab[det]("M") は大変違っています。
|
|
(2) MapleMatrix - MapleMatrix は完全に定義された Maple 行列と等価な Maple の式です。MapleMatrix と Maple 中の "matrix" 型とを混同しないようにして下さい。 MapleMatrix は array, hfarray, matrix, vector, Array, Matrix, Vector, float, あるいは integer でありえます。行列のすべての要素は型 numeric でなければなりません。
|
•
|
Maple 中の定数は Matlab では 1x1 行列で表現されます。 Matlab[det](543) のような関数呼び出しが利用できます。逆に Matlab から返された 1x1 行列は、 Maple では定数に戻されます。 これは Maple ユーザが本当に 1x1 行列が返ってくるのを期待する場合を特例にします。
|
•
|
値を返す Matlab 関数の多くは定数か、ハードウェアのデータタイプ (float[8] か complex[8]) を持った rtable (すなわち Array, Matrix, や Vector)を返します。例外は Matlab[size] と Matlab[dimensions] で、どちらも整数のリストを返します。
|
•
|
評価における中間段階を計算するため、Maple はいくつかの Matlab 変数を使います。これらの変数の名前は頭に "result_for_maple"がつきます。例えば、result_for_maple_1, result_for_maple_2 などです。
|
•
|
完全に定義されていない配列 (array) から hfarrays へ変換するときに未定義の要素を 0 に置き換えるので、 Matlab[setvar]() もこれを行います。 たとえば、 Matlab[setvar]("x", array(1..2, [])) は Matlab で x=[0 0] と設定します。しかし、Matlab[setvar]("x", hfarray(1..2, [])) は違った振る舞いを示します。Matlab では x=[NaN NaN] と割り当てます。この不一致は将来のバージョンで変わるでしょう。
|
•
|
1次元のオブジェクトは Matlab では行または列ベクトルとして扱われ、Maple の prettyprinter と整合しています。これは対応する linalg ルーチンの振る舞いと必ずしも整合していません。
|
•
|
注意: Maple は Matlab セッションを 1 つだけ開くことができます。これは、たとえパラレルサーバの Maple を走らせていても、 Maple で定義された Matlab 変数はセッション中のすべてのワークシートに適用されることを意味します。
|
|
|
例
|
|
例からの出力を見るには、ワークシートへコピーして実行して下さい。(Maple から Matlab へのアクセスに関する情報は Matlab[setup] を参照。)
解析のためにデータを作成します。
>
|
num := 1500:
Time := [seq(.03*t, t=1..num)]:
data := [seq((3.6*cos(Time[t]) + cos(6*Time[t])), t=1..num)]:
plots[pointplot](zip((x,y)->[x,y],Time,data), style=line);
|
データにノイズを加えます。
>
|
tol := 10000:
r := rand(0..tol):
noisy_data := [seq(r()/(tol)*data[t], t=1..num)]:
plots[pointplot](zip((x,y)->[x,y],Time,noisy_data), style=line);
|
Matlab を使って Fourier 変換を計算します。
複素数の Vector を得たかどうかのチェックします。
>
|
VectorOptions(ft, datatype);
|
そうなっているので、2 つの部分に分けます。
>
|
real_part := map(Re, ft):
imag_part := map(Im, ft):
|
返された値のサイズを見ます。
長さは定義しておいた 'num' 変数と同じです。
パワースペクトルを計算するため、 ft * conj(ft) /n が必要です。これは Matlab で行います。
最初に 'ft' を Matlab のメモリーに入れます。
>
|
setvar("FT", ft);
setvar("n", num);
|
evalM で望んだ結果を計算し、結果を変数へ割り当て、そこで得るようにします。
>
|
evalM("result = FT.*conj(FT)/n");
|
結果を得ます。
>
|
pwr := getvar("result"):
|
この結果は複素数でないことに注意します。
>
|
VectorOptions(pwr, datatype);
|
パワースペクトルをプロットします。この場合 'pwr' をリストに変換する必要があります。
>
|
pwr_list := convert(pwr, list):
|
対称なので、値の初めの半分をプロットすれば十分です。
>
|
pwr_points := [seq([(t-1)/Time[num], pwr_list[t]], t=1..num/2)]:
plots[pointplot](pwr_points, style=line);
|
2 つの明らかな周波数があります。最も支配的な周波数は次のものです。
>
|
pwr1 := max(op(pwr_list));
i1 := seq(`if`(pwr_points[t,2]=pwr1, t, NULL), t=1..nops(pwr_points));
f1 := pwr_points[i1,1];
|
そして周期は次の通りです。
2 番目の周波数を求めます。プロットから、それは t1 よりも後にあります。
>
|
pwr2 := max(seq(pwr_list[t], t=i1+5..num/2));
i2 := seq(`if`(pwr_points[t,2]=pwr2, t, NULL), t=1..nops(pwr_points));
f2 :=pwr_points[i2,1];
|
そして 2 番目の周期は次の通りです。
T1 と T2 はもとの方程式で角度乗数に近いことに注意します。これは期待した通りです。
|
|