関数のパラメーター化
概要
このトピックでは、fzero
や integral
など、MATLAB® の "関数を引数とする関数" に渡す数学関数への追加パラメーターを保存したり、これらにアクセスしたりする方法を説明します。
MATLAB の関数を引数とする関数は、所定の値の範囲に対して数式を計算します。これらは、関数ハンドル (関数へのポインター) を入力として受け入れる関数のため、関数を引数とする関数と呼ばれます。これらの関数ではそれぞれ、目的関数に特定数の入力変数があることが必要です。たとえば、関数 fzero
および integral
は、正確に 1 つの入力変数をもつ関数へのハンドルのみを受け入れます。
係数 b および c の異なる値について、3 次多項式 x3 +
bx +
c の零点を求めるとします。3 つの入力変数 (x、b、c) を受け入れる関数を作成できても、これら 3 つの入力をすべて必要とする関数ハンドルを関数 fzero
に渡すことはできません。ただし、無名関数または入れ子関数のプロパティを利用すると、追加で入力の値を定義することができます。
入れ子関数を使用したパラメーター化
パラメーターを定義する 1 つの方法は、プログラム ファイル内の別の関数に完全に含まれた関数である "入れ子関数" を使用する方法です。この例では、親関数 findzero
および入れ子関数 poly
を含む findzero.m
という名前のファイルを作成します。
function y = findzero(b,c,x0) y = fzero(@poly,x0); function y = poly(x) y = x^3 + b*x + c; end end
この入れ子関数は、1 つの入力変数 x
をもつ 3 次多項式を定義します。親関数はパラメーター b
と c
を入力値として受け入れます。poly
を findzero
内の入れ子にする理由は、入れ子関数がその親関数のワークスペースを共有できるためです。その結果、findzero
に渡した b
と c
の値に poly
からアクセスできるようになります。
b = 2
と c = 3.5
をもつ多項式の零点を求めるには、開始点 x0 = 0
を使用して、コマンド ラインから findzero
を次のように呼び出します。
x = findzero(2,3.5,0)
x = -1.0945
無名関数を使用したパラメーター化
追加のパラメーターにアクセスする別の方法は、"無名関数" を使用する方法です。無名関数とは、別個のプログラム ファイルを作成することなく、単一のコマンドで定義できる関数です。この関数では、現在のワークスペース内で利用できるすべての変数を使用することができます。
たとえば、3 次多項式を記述する無名関数へのハンドルを作成し、零点を求めます。
b = 2; c = 3.5; cubicpoly = @(x) x^3 + b*x + c; x = fzero(cubicpoly,0)
x = -1.0945
変数 cubicpoly
は、1 つの入力 x
をもつ無名関数の関数ハンドルです。無名関数の入力は、関数ハンドルを作成する @
記号の直後に続く小かっこ内に含めます。係数 b
および c
は cubicpoly
の作成時にワークスペース内に存在するので、この無名関数ではこれらの係数の入力は不要です。
無名関数に対しては、中間変数 cubicpoly
の作成は不要です。その代わりに、fzero
を呼び出すときに関数ハンドルの完全な定義を含めます。
b = 2; c = 3.5; x = fzero(@(x) x^3 + b*x + c,0)
x = -1.0945
無名関数を使用して、関数ファイルに定義したさらに複雑な目的関数を呼び出すこともできます。たとえば、次の関数定義をもつ cubicpoly.m
という名前のファイルがあるとします。
function y = cubicpoly(x,b,c) y = x^3 + b*x + c; end
コマンド ラインで b
と c
を定義した後、cubicpoly
を呼び出す無名関数で fzero
を呼び出します。
b = 2; c = 3.5; x = fzero(@(x) cubicpoly(x,b,c),0)
x = -1.0945
メモ
パラメーターの値を変更するには、新しい無名関数を作成しなければなりません。たとえば、次のようになります。
b = 10; c = 25; x = fzero(@(x) x^3 + b*x + c,0);