FreeMatで使われるプログラム書式の基本を押さえよう:無償ソフトで技術計算しよう【プログラミング基礎編】(3)(2/2 ページ)
今回は、FreeMatでプログラムを記載する書式「mファイル」についての解説。数値を渡されて処理結果を返すタイプのプログラム「関数mファイル」や、数式を登録する働きを持つ「無名関数」についても説明する。
無名関数、inlineコマンド
スクリプトmファイルでは、繰り返し使用する処理は「関数mファイル」として別ファイルに保存し、「スクリプトmファイル」から呼び出します。繰り返し使うのが数式の場合、たった1行のために1つのファイルを作るのは面倒です。
そこで、式のように1行で表されるものでは、「無名関数」と呼ばれる簡易的な方法が使えます。無名関数は、「変数=@(引数)式」という形で定義します。スクリプト内では変数(引数)で処理を行います。
例えば、コマンドウィンドウで、z=@(x,y) [x+y,x-y];と入力すると、x,yからx+yとx-yを計算し、2列の配列でzに返す無名関数が定義されます。次に、z(2,3)と入力すると、ans = 5 -1と計算結果は5と-1の配列となって返ってきたことが分かります。
例として、ex309.mを無名関数を使って書き換えてみたのが、ex312.mです。
clear; x_y=@(x) [cosd(x);sind(x)]; xy=x_y(1:360); plot(xy(1,:),xy(2,:)); axis('square');
x_y=@(x) [cosd(x);sind(x)];でcosとsin値が行方向に並ぶ配列となるように無名関数を定義しています。xy=x_y(1:360);で、無名関数を用いて計算した結果を配列xyに格納しています。
無名関数と同じような働きをするのが、「inline」コマンドです。
inlineコマンドは、変数=inline('式')として定義します。例えば、コマンドウィンドウで、z=inline('x+y')と入力すると、z = inline function object f(x,y) = x+yと表示され、x+yが定義されたことが分かります。次に、z(2,3)と入力すると、ans = 5とx+yの計算結果が返ってきたことが分かります。inlineコマンドでは無名関数のように式を配列として定義できません。
例として、ex309.mをinlineコマンドを使って書き換えてみたのが、ex313.mです。
z1=inline('cosd(x)');z2=inline('sind(x)');とcosとsin値をinlineコマンドで定義しています。xy=[z1(1:360);z2(1:360)];として、inlineコマンドで定義された関数で計算された結果を配列xyに格納しています。
clear; z1=inline('cosd(x)'); z2=inline('sind(x)'); xy=[z1(1:360);z2(1:360)]; plot(xy(1,:),xy(2,:)); axis('square');
関数mファイルは、パスを設定したフォルダに保存すれば、FreeMatの関数と同じように用いることが可能です。例題として、関数と積分区間を与えられると、積分値を返すような関数mファイルを作成してみましょう。
コマンドウィンドウでx=linspace(0,2,100);y=x;z=trapz(x,y)と入力すると、z = 2.0000と積分値が得られることが分かります。linspace(0,2,100)は0〜2の間に等間隔で100個の要素を生成するコマンドです。0:0.02:2でも同じように等間隔の要素を生成できますが、区間幅(この場合0.02)によっては、配列の最後の要素が指定した値と異なることがあるので、区間を指定できるlinspaceコマンドを使うようにしてください。
xの配列生成と与えられた関数での配列xでの値を計算する部分を関数mファイルに組み込んだのがex314.mです。関数は文字列sとして受け取り、inlineコマンドで数式にします。次に、積分区間の配列をlinspace(a,b,n)で生成し、積分区間の配列に対応した関数値を配列yとして求めます。最後に台形積分コマンドでtrapz(x,y)で積分値を求めます。
function z=ex314(s,a,b,n) fx=inline(s); x=linspace(a,b,n); y=fx(x); z=trapz(x,y);
コマンドウィンドウで、ex314('x',0,2,100)と入力すると、「ans = 2.0000」と正しく計算されていることが分かります。別な関数でも計算してみます。
◇
プログラミング基礎編は今回で終了です。お疲れさまでした。次の連載は「プログラミング処理編」として、ファイル入出力に関するコマンドを紹介します。
参考文献
- 「MATLABハンドブック」小林一行著、秀和システム刊
- 「はじめてのFreeMat」赤間世紀著、工学社刊
筆者紹介
伊藤孝宏(いとう・たかひろ)
1960年生。小型モーターメーカーのエンジニア。博士(工学)。専門は流体工学、音・振動工学。現在は、LabVIEWを使って、音不良の計測・診断ソフト、特性自動検査装置などの開発を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.