【第6回】

<内容>

1.  ユーザー定義関数

·       ユーザーが独自に定義する関数の作成方法を学ぶ.

 

2.  数学関数に関する関数

·       1変数関数f(x)の最小点や零点を求める方法について学ぶ.

 

 

<演習>

1.ユーザー定義関数

Mファイルによるユーザー定義関数の書き方を例題2.15に従い説明する.

 

n個のデータから,平均と分散を求める関数mean1を作成する.この関数名と同じMファイルmean1.mを作成し,そのファイルに具体的な関数の内容を記述する.

 

1行目に関数の形を記入する.functionが関数を定義するためのコマンドである.2行目のコメント行は,helpコマンド参照される内容であり,書いておいた方がよい.3行目以降が具体的な関数の内容であり,最終行のendfunctionで終了する.ただし,最終行のendfunction省略可であり,省略すればMatlabで実行できる.

 

 関数名も変数と同様,英字で初めなければならない.数字やアンダーバーも先頭以外では使用できる.ただし,システムの「命令語(コマンド)」(ifswitchinput等)はユーザー定義関数名には使用できない.

 

 

練習6-1

 例題2.15(教科書p.48)に従い,mean1.mを作成し,その動作を確認してみよ.

 

 

問題6-1

 問題1.(教科書p.49)を行え.(ヒント:例題2.13)そして,以下を確認してみよ.

  f = [ 1  5  15  29  34  28 ];

  g = [ 1  3  7  8  8  8 ];

  gcd = euclid(f, g)

 として,

  gcd = 1  2  4

 が得られるかどうか.

 

【答え】教科書p.112

 

 

―――――――――――――――――――――――――――――――――――――――――――――――――――――――

 

 

2.数学関数に関する関数

21fmin

 1変数関数f(x)の最小点を求める方法として,ランダムサーチ法を用いる(教科書p.50参照).この方法は,初期値として,探索中心c0と探索幅a0が与えられる.c0±a0内の点xn個だけ乱数により生成する.この各xに対する関数値f(x)を計算し,もっとも最小となるxを次回の探索中心c1とする.探索幅を半分のa0/2とし,同様の操作を行う.終了条件は,探索幅aiが十分に小さくなったときである.

 

  Octave 4.0ではfminbndが用意されているのでfmin.mを作成する必要はないが,原理は理解しておくこと.

 

 

練習6-2

 例題2.16(教科書p.51)により,その動作を確認してみよ.

(注)関数の最小値を求める関数はfminでなく,fminbndである.

 

注)ユーザー定義関数のもう一つの与え方である対話形式がここに書かれており,最初の3行がそれに当たる.endfunctionと入力するまでが関数の定義内容となる.

 

Octaveでは,ユーザー定義関数の作成において,(1) Mファイル(2) 対話型(コマンド入力)による2つの方法があるが,Matlabでは,対話型による方法は利用できない.

 

対話型によるユーザー関数定義は,一度,Octaveを終了すると消えてしまう一時的なものである点に注意すること.

 

 

22fzero

 1変数関数f(x)の零点を求める方法として,二分法がある(教科書p.51参照).この方法は,初期値として与えられた区間[a0, b0]の中点c0=(a0+b0)/2を計算し,この中点で区切られる2区間,すなわち,区間[a0, c0]と区間[c0, b0]のどちら側に零点があるかを判別し,零点のある区間を新たな探索区間として採用する.この区間の中点を計算し,同様な操作を行い,探索区間を1/2ずつしていくことにより,零点を求める.終了条件は,中点での関数値f(ci)が十分に零と見なせるときである.

 

 ただし,f(a0) f(b0)0を満たす必要がある.これは,区間[a0, b0]内に少なくとも1つは零点があることを意味する.すなわち,f(a0)f(b0)が異符号であれば,区間[a0, b0]内にx軸と交わる点(零点)が少なくとも1つは存在する.

 

  Octave 4.0ではfzeroが用意されているのでfzero.mを作成する必要はないが,原理は理解しておくこと.

 

 

練習6-3

 例題2.17(教科書p.52)により,その動作を確認してみよ.なお,z1が零点であることの確認(y=f1(z1))をした結果は,教科書とは異なるが,ほぼ零であることを確認することができる.

 

 

練習6-4

 例題2.18(教科書p.53)を行え.

 

注)関数を定義するMファイルf2.mの2行目で,

  y = exp(-0.5*x) .* cos(5*x) - 0.4 * exp(-0.3*x);

となっている点に注意せよ.「.」が無いと変数xベクトルとして与えることができない.「.*」は行列(ここではベクトル)の要素ごとに掛け算を行うという意味である(教科書p.16を参照).足し算,引き算は元々,要素ごとに行うので,「.」を付ける必要はないが,掛け算と割り算には必要となる.

 

 

問題6-2

 次の関数の零点を,[-5, 5]の範囲ですべて求めよ.(ヒント:例題2.18)ただし,ex7.mを修正しないとx = 0の零点を求めることができない.また,x = 01個だけ表示させること.

  y = sin(2x)

 

【答え】-4.71239  -3.14159  -1.57080   0.00000   1.57080   3.14159   4.71239

 

 

【レポート課題(6)(授業終了後にアップロード)

  RePORT