Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

MultiStartlsqnonlin、問題ベース

この例では、問題ベースのアプローチで lsqnonlinMultiStart を組み合わせて使用して、関数をデータに適合させる方法を示します。

多くのフィッティング問題には複数のローカル ソリューションが存在します。MultiStart は、最適なフィッティングを意味するグローバル ソリューションを見つけるのに役立ちます。

モデルは次のとおりです。

y=a+bx1sin(cx2+d),

ここで、入力データは x=(x1,x2) であり、パラメーター abc、および d は未知のモデル係数です。

問題データを作成する

ほとんどの問題には測定データが含まれます。この問題では、ノイズを含む人工データを作成します。200 個のデータ ポイントと応答を作成します。値 a=-3b=1/4c=1/2d=1 を指定します。

rng default % For reproducibility
fitfcn = @(p,xdata)p(1) + p(2)*xdata(:,1).*sin(p(3)*xdata(:,2)+p(4));
N = 200; % Number of data points
preal = [-3,1/4,1/2,1]; % Real coefficients
xdata = 5*rand(N,2); % Data points
ydata = fitfcn(preal,xdata) + 0.1*randn(N,1); % Response data with noise

最適化変数と問題の作成

最適化変数はモデル係数です。変数を作成するときに、その境界を設定します。正弦関数は幅 2π の任意の区間にわたって全範囲の値を取るため、変数 d は絶対値で π を超える必要はありません。高い周波数を許可すると応答が不安定になったり、収束が不正確になったりする可能性があるため、係数 c の絶対値は 20 より小さくする必要があると想定します。

a = optimvar("a");
b = optimvar("b");
c = optimvar("c",LowerBound=-20,UpperBound=20);
d = optimvar("d",LowerBound=-pi,UpperBound=pi);
prob = optimproblem;

目的関数の作成

モデル応答とデータ間の差の二乗の合計として目的関数を作成します。

resp = a + b*xdata(:,1).*sin(c*xdata(:,2) + d);
prob.Objective = sum((resp - ydata).^2);

初期点を作成して問題を解決する

初期点は、係数の値を持つ構造体です。初期点を任意に[5,5,5,0]に設定します。

x0.a = 5;
x0.b = 5;
x0.c = 5;
x0.d = 0;
[sol,fval] = solve(prob,x0)
Solving problem using lsqnonlin.

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
sol = struct with fields:
    a: -2.6149
    b: -0.0238
    c: 6.0191
    d: -1.6998

fval = 28.2524

lsqnonlin は、モデル パラメーター値 (–3,1/4,1/2,1) に特に近いわけではないローカル ソリューションを見つけます。

MultiStart を使用して改善されたソリューションを検索する

より良い解決策を探すには、MultiStart オブジェクトを作成します。ソルバーが反復するときに最適な関数値をプロットします。

ms = MultiStart(PlotFcns=@gsplotbestf);

もう一度 solve を呼び出しますが、今回は ms を使用します。MultiStart の開始点を 50 個指定します。

rng default % For reproducibility
[sol2,fval2] = solve(prob,x0,ms,MinNumStartPoints=50)
Solving problem using MultiStart.

MultiStart completed the runs from all start points. 

All 50 local solver runs converged with a positive local solver exitflag.
sol2 = struct with fields:
    a: -2.9852
    b: -0.2472
    c: -0.4968
    d: -1.0438

fval2 = 1.6464

MultiStart は、パラメータ値 (–3,–1/4,–1/2,–1) 付近のグローバル ソリューションを探します。この解は、最初の係数を除くすべての係数の符号を変更しても同じ数値の誤差が得られるため、真のパラメータ値 (–3,1/4,1/2,1) に近い解と同等です。残差誤差のノルムは約 28 から約 1.6 に減少し、10 倍以上の減少となります。

参考

| |

関連するトピック