ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

非線形関数の最適近似

この例では、データの集合への非線形関数の最適な近似を示します。多変数非線形関数を最小化するために、Nelder-Mead シンプレックス (直接探索) アルゴリズムを実装したものである FMINSEARCH を使用します。

まず、いくつかのサンプル データを作成し、プロットします。

t = (0:.1:2)';
y = [5.8955 3.5639 2.5173 1.9790 1.8990 1.3938 1.1359 1.0096 1.0343 ...
     0.8435 0.6856 0.6100 0.5392 0.3946 0.3903 0.5474 0.3459 0.1370 ...
     0.2211 0.1704 0.2636]';
plot(t,y,'ro'); hold on; h = plot(t,y,'b'); hold off;
title('Input data'); ylim([0 6])

目的は、このデータを 2 つの線形パラメーターと 2 つの非線形パラメーターをもつ以下の関数に近似することです。

   y =  C(1)*exp(-lambda(1)*t) + C(2)*exp(-lambda(2)*t)

この関数に近似するために、関数 FITFUN を作成します。非線形パラメーター (lambda) とデータ (t と y) を与えると、FITFUN は、この式に対する近似誤差を計算し、ライン (h) を更新します。

type fitfun
function err = fitfun(lambda,t,y)
%FITFUN Used by FITDEMO.
%   FITFUN(lambda,t,y) returns the error between the data and the values
%   computed by the current function of lambda.
%
%   FITFUN assumes a function of the form
%
%     y =  c(1)*exp(-lambda(1)*t) + ... + c(n)*exp(-lambda(n)*t)
%
%   with n linear parameters and n nonlinear parameters.

%   Copyright 1984-2004 The MathWorks, Inc. 
%   $Revision: 1.1.8.13.2.2 $  $Date: 2014/02/05 21:22:25 $

A = zeros(length(t),length(lambda));
for j = 1:length(lambda)
   A(:,j) = exp(-lambda(j)*t);
end
c = A\y;
z = A*c;
err = norm(z-y);

(開始の) lambda の初期推定に対して推測を行い、FMINSEARCH を呼び出します。lambda を調整することによって FITFUN から返された誤差を最小化します。lambda の最終値を返します。中間の近似をプロットするために出力関数を使います。

start = [1;0];
% We use an anonymous function to pass additional parameters t, y, h to the
% output function.
outputFcn = @(x,optimvalues,state) fitoutputfun(x,optimvalues,state,t,y,h);
options = optimset('OutputFcn',outputFcn,'TolX',0.1);
estimated_lambda = fminsearch(@(x)fitfun(x,t,y),start,options)
estimated_lambda =

    3.5897
    0.0030

この情報は役に立ちましたか?