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

Figure contains an axes object. The axes object with title Data and Best Fitting Exponential Curve contains 2 objects of type line. These objects represent Data, Fitted Curve.

関連するトピック