Main Content

最適化を介して曲線近似

この例では、非線形関数をデータに当てはめる方法を説明します。この例での非線形関数は、標準の指数減衰曲線です。

y(t)=Aexp(-λt),

y(t) は時間 t での応答であり、Aλ は近似に使うパラメーターです。曲線を近似することは、誤差の二乗和を最小化するパラメーター A および λ を見つけることを意味します。

i=1n(yi-Aexp(-λti))2,

ここで、時間は ti、応答は yi,i=1,,n です。誤差の二乗和は目的関数です。

サンプル データの作成

通常は、測定によってデータを入手します。この例では、A=40λ=0.5 で、正規分布の疑似乱数誤差を含むモデルを基に人為的なデータを作成します。

rng default % for reproducibility
tdata = 0:0.1:10;
ydata = 40*exp(-0.5*tdata) + randn(size(tdata));

目的関数の作成

パラメーター A とパラメーター lambda およびデータ tdata とデータ ydata を受け入れ、モデル y(t) の誤差の二乗和を返す関数を作成します。最適化するすべての変数 (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);

tdataydata などの追加のパラメーターを含める場合の詳細については、関数のパラメーター化を参照してください。

最適な近似パラメーターの検索

正の乱数のパラメーター セット 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

関連するトピック