最適化を介して曲線近似
この例では、非線形関数をデータに当てはめる方法を説明します。この例での非線形関数は、標準の指数減衰曲線です。
は時間 での応答であり、 と は近似に使うパラメーターです。曲線を近似することは、誤差の二乗和を最小化するパラメーター および を見つけることを意味します。
ここで、時間は 、応答は です。誤差の二乗和は目的関数です。
サンプル データの作成
通常は、測定によってデータを入手します。この例では、、 で、正規分布の疑似乱数誤差を含むモデルを基に人為的なデータを作成します。
rng default % for reproducibility tdata = 0:0.1:10; ydata = 40*exp(-0.5*tdata) + randn(size(tdata));
目的関数の作成
パラメーター A
とパラメーター lambda
およびデータ tdata
とデータ ydata
を受け入れ、モデル の誤差の二乗和を返す関数を作成します。最適化するすべての変数 (A
および lambda
) を、1 つのベクトル変数 (x
) にまとめます。詳細については、多変数関数の最小化を参照してください。
type sseval
function sse = sseval(x,tdata,ydata) A = x(1); lambda = x(2); sse = sum((ydata - A*exp(-lambda*tdata)).^2);
この目的関数を sseval.m
という名前のファイルとして MATLAB® パス上に保存します。
fminsearch
ソルバーは 1 つの変数 x
の関数に適用されます。しかし、関数 sseval
には変数が 3 つあります。余分な変数 tdata
および ydata
は最適化する対象の変数ではなく、最適化用のデータです。fminsearch
の目的関数を、x
のみの関数として定義します。
fun = @(x)sseval(x,tdata,ydata);
tdata
や ydata
などの追加のパラメーターを含める場合の詳細については、関数のパラメーター化を参照してください。
最適な近似パラメーターの検索
正の乱数のパラメーター セット x0
から始めて、fminsearch
によって、目的関数を最小化するパラメーターを検索します。
x0 = rand(2,1); bestx = fminsearch(fun,x0)
bestx = 2×1
40.6877
0.4984
結果 bestx
は、データを生成したパラメーター、A = 40
および lambda = 0.5
にかなり近くなっています。
近似の質の確認
近似の質を確認するために、データおよび結果の近似応答曲線をプロットします。モデルの返されたパラメーターから応答曲線を作成します。
A = bestx(1); lambda = bestx(2); yfit = A*exp(-lambda*tdata); plot(tdata,ydata,'*'); hold on plot(tdata,yfit,'r'); xlabel('tdata') ylabel('Response Data and Curve') title('Data and Best Fitting Exponential Curve') legend('Data','Fitted Curve') hold off