メインコンテンツ

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

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.

<stopping criteria details>
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.

Figure MultiStart contains an axes object. The axes object with title Best Function Value: 1.6464, xlabel Local solver call, ylabel Function value contains an object of type scatter.

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 分の 1 以上減少しています。

参考

| |

トピック