Main Content

lsqcurvefit を使用した非線形曲線近似

lsqcurvefit によってパラメーター化された非線形関数がデータに簡単に当てはめられます。lsqnonlin も使用できます。lsqcurvefit は曲線近似に lsqnonlin を呼び出す場合に簡単かつ便利な方法を提供します。

この例では、ベクトル xdata が 100 個のデータ点を示し、ベクトル ydata が対応する測定値を示します。問題のデータを生成します。

rng(5489,'twister') % reproducible
xdata = -2*log(rand(100,1));
ydata = (ones(100,1) + .1*randn(100,1)) + (3*ones(100,1)+...
    0.5*randn(100,1)).*exp((-(2*ones(100,1)+...
   .5*randn(100,1))).*xdata);

xdataydata のモデル化された関係は以下になります。

ydatai=a1+a2exp(-a3xdatai)+εi.

このコードは、平均 2 の指数分布から 100 個の独立したサンプルによって xdata を生成します。コードは、a = [1;3;2] を使用して定義方程式から ydata を生成します。これには、標準偏差 [0.1;0.5;0.5] をもつ正規偏差を追加して摂動が与えられています。

この問題のゴールは、データに最も当てはまるモデルのパラメーター aˆii = 1, 2, 3 を見つけることです。

lsqcurvefit を使用してパラメーターをデータに当てはめるには、近似関数を定義しなければなりません。無名関数として近似関数 predicted を定義します。

predicted = @(a,xdata) a(1)*ones(100,1)+a(2)*exp(-a(3)*xdata); 

モデルをデータに当てはめるためにlsqcurvefit はパラメーターの初期推定 a0 を必要とします。

a0 = [2;2;2];

lsqcurvefit を呼び出して、最適適合パラメーター aˆi を求めます。

[ahat,resnorm,residual,exitflag,output,lambda,jacobian] =...
   lsqcurvefit(predicted,a0,xdata,ydata);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

得られたパラメーターを検証します。

disp(ahat)
    1.0169
    3.1444
    2.1596

適合値 ahata = [1;3;2] の 8% 以内に収まります。

Statistics and Machine Learning Toolbox™ ソフトウェアがインストールされている場合、関数 nlparci を使用すると、ahat 推定の信頼区間が生成できます。

参考

| (Statistics and Machine Learning Toolbox)

関連するトピック