FreeMatで使われるプログラム書式の基本を押さえよう無償ソフトで技術計算しよう【プログラミング基礎編】(3)(2/2 ページ)

» 2014年06月20日 11時50分 公開
[伊藤孝宏,MONOist]
前のページへ 1|2       

無名関数、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');
ex312.m

>>「ex312.m」ダウンロード

 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');
ex313.m

>>「ex313.m」ダウンロード

 関数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.m

>>「ex314.m」ダウンロード

 コマンドウィンドウで、ex314('x',0,2,100)と入力すると、「ans = 2.0000」と正しく計算されていることが分かります。別な関数でも計算してみます。


 プログラミング基礎編は今回で終了です。お疲れさまでした。次の連載は「プログラミング処理編」として、ファイル入出力に関するコマンドを紹介します。

参考文献

  • 「MATLABハンドブック」小林一行著、秀和システム刊
  • 「はじめてのFreeMat」赤間世紀著、工学社刊

無償ソフトで技術計算しよう

FreeMat

無償の工学計算ソフトでも、かなり高度な計算ができる!


筆者紹介

伊藤孝宏(いとう・たかひろ)

1960年生。小型モーターメーカーのエンジニア。博士(工学)。専門は流体工学、音・振動工学。現在は、LabVIEWを使って、音不良の計測・診断ソフト、特性自動検査装置などの開発を行っている。




前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.