Main Content

関数のパラメーター化

概要

このトピックでは、fzerointegral など、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 次多項式を定義します。親関数はパラメーター bc を入力値として受け入れます。polyfindzero 内の入れ子にする理由は、入れ子関数がその親関数のワークスペースを共有できるためです。その結果、findzero に渡した bc の値に poly からアクセスできるようになります。

b = 2c = 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 および ccubicpoly の作成時にワークスペース内に存在するので、この無名関数ではこれらの係数の入力は不要です。

無名関数に対しては、中間変数 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

コマンド ラインで bc を定義した後、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);

関連するトピック