このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
MultiStartとlsqnonlin、問題ベース
この例では、問題ベースのアプローチで lsqnonlin と MultiStart を組み合わせて使用して、関数をデータに適合させる方法を示します。
多くのフィッティング問題には複数の局所解が存在します。MultiStart は、最適なフィッティングを意味する大域解を見つけるのに役立ちます。
モデルは次のとおりです。
,
ここで、入力データは であり、パラメーターa、b、c、および d は未知のモデル係数です。
問題データを作成する
ほとんどの問題には測定データが関係します。この問題では、ノイズを含んだ人工データを作成します。200 個のデータ ポイントと応答を作成します。値 、、、 を指定します。
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
最適化変数と問題の作成
最適化変数はモデル係数です。変数を作成するときに、変数の境界を設定します。正弦関数は幅 の任意の間隔にわたって全範囲の値を取るため、変数 は絶対値で を超える必要はありません。高い周波数を許可すると応答が不安定になったり、収束が不正確になったりする可能性があるため、係数 の絶対値は 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.

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 以上減少しています。
参考
MultiStart | solve | lsqnonlin