Programming and Data Types | ![]() ![]() |
関数ハンドルの計算の例題
この節は、関数ハンドルの使い方や計算法を示す2つの例題を示します。
例題 1 - 簡単な関数ハンドル
plot_fhandle
と云う名前の関数を定義するつぎの例題は、関数ハンドルとデータを受け取り、そのデータに関して、関数ハンドルの計算を行なうものです。
function x = plot_fhandle(fhandle, data) plot(data, feval(fhandle, data))
関数sin
と下に示す引数を関数と共に、plot_fhandle
をコールすると、求まる計算結果は、つぎのプロットを作成します。
plot_fhandle(@sin, -pi:0.01:pi)![]()
例題 2 - 関数ハンドルとサブ関数
この例題の中のM-ファイルは、主関数fitcurvedemo
とサブ関数
expfun
です。定義として、サブ関数は、自身のM-ファイルのスコープの中のみで見ることができます。もちろん、そのM-ファイルの中の他の関数での使用だけは、可能です。
このコードのオーサは、このM-ファイルの範囲の外で、expfun
を使おうとしています。この例題は、関数ハンドルをサブ関数expfun
に作成し、サブ関数に関するアクセス情報を捕らえ、MATLAB環境の中の任意の位置からコールするものです。関数ハンドルは、fminsearch
に渡し、通常のスコープの外側でサブ関数をうまく計算するものです。
下に示すコードは、fitcurvedemo
とサブ関数expfun
を定義するものです。ライン6は、関数ハンドルをexpfun
に作成し、それを変数fun
に割り当てます。ライン16で、fminsearch
へのコールで、サブ関数の通常のスコープの外側に関数ハンドルを渡します。関数
fminsearch
は、feval
を使って、そのハンドルを通して、サブ関数を計算します。
1 function Estimates = fitcurvedemo 2 % FITCURVEDEMO 3 % Fit curve to data where user chooses equation to fit. 4 5 % Define function and starting point of fitting routine. 6 fun = @expfun; 7 Starting = rand(1, 2); 8 9 % First, we create the data. 10 t = 0:.1:10; t=t(:); % to make 't' a column vector 11 Data = 40 * exp(-.5 * t) + randn(size(t)); 12 m = [t Data]; 13 14 % Now, we can call FMINSEARCH: 15 options = optimset('fminsearch'); % Use FMINSEARCH defaults 16 Estimates = fminsearch(fun, Starting, options, t, Data); 17 18 % To check the fit 19 plot(t, Data, '*') 20 hold on 21 plot(t, Estimates(1) * exp(-Estimates(2) * t), 'r') 22 xlabel('t') 23 ylabel('f(t)') 24 title(['Fitting to function ', func2str(fun)]); 25 legend('data', ['fit using ', func2str(fun)]) 26 hold off 27 28 % ---------------------------------------------------------- 29 30 function sse = expfun(params, t, Data) 31 % Accepts curve parameters as inputs, and outputs fitting the 32 % error for the equation y = A * exp(-lambda * t); 33 A = params(1); 34 lambda = params(2); 35 36 Fitted_Curve = A .* exp(-lambda * t); 37 Error_Vector = Fitted_Curve - Data; 38 39 % When curve fitting, a typical quantity to minimize is the sum 40 % of squares error 41 sse = sum(Error_Vector .^ 2);
![]() |
ハンドルを使って関数を計算 | 関数ハンドル情報の表示 | ![]() |