ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

lsqcurvefit

非線形曲線近似 (データ適合) 問題を最小二乗近似的に解く

説明

非線形最小二乗ソルバー

問題を解く係数 x を見つけます

minxF(x,xdata)ydata22=minxi(F(x,xdatai)ydatai)2,

xdata は入力データ、ydata は観測された出力です。ここで、xdata および ydata は行列またはベクトル、F (x, xdata) は ydata と同サイズの行列値またはベクトル値関数です。

オプションで、x の成分は下限 lb と上限 ub をもつことができます。引数 x、lb、および ub はベクトルまたは行列とすることができます。行列引数 を参照してください。

関数 lsqcurvefitlsqnonlin と同じアルゴリズムを使用します。lsqcurvefit の目的は単にデータ適合問題用に便利なインターフェイスを与えることです。

二乗和を計算するというよりもむしろ、lsqcurvefit は次の "ベクトル" 値関数を計算するユーザー定義関数を必要とします。

F(x,xdata)=[F(x,xdata(1))F(x,xdata(2))F(x,xdata(k))].

x = lsqcurvefit(fun,x0,xdata,ydata) は、x0 を開始値として、非線形関数 fun(x,xdata) がデータ ydata に (最小二乗的に) 最も合う係数 x を求めます。ydata は、fun が返すベクトル (または行列) F と同じサイズでなければなりません。

メモ

追加パラメーターの受け渡し は必要に応じて他のパラメーターを関数 fun(x) へ渡す方法を説明します。

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub) は、解が常に lb  x  ub の範囲に存在するように、設計変数 x に上限と下限を定義します。lb(i) = ub(i) を指定することによって解の要素 x(i) を修正できます。

メモ

問題の指定された入力範囲が矛盾する場合、出力 xx0、出力 resnormresidual[] です。

範囲 lb ≤ x ≤ ub に違反する x0 の要素は範囲で定義されたボックスの内部にリセットされます。範囲内の要素は変更されません。

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) は、options で指定された最適化オプションを使って最小化します。optimoptions を使用してこれらのオプションを設定してください。範囲が存在しない場合、lbub に空行列を渡してください。

x = lsqcurvefit(problem) は、problem の最小値を求めます。ここで、problem入力引数に説明されている構造体です。作業のエクスポートで説明されているように、最適化アプリから問題をエクスポートして problem 構造体を作成します。

[x,resnorm] = lsqcurvefit(___) は、すべての入力引数に対して、x での残差の 2 乗ノルム値 (sum((fun(x,xdata)-ydata).^2)) を返します。

[x,resnorm,residual,exitflag,output] = lsqcurvefit(___) は上記に加え、解 x における残差の値 fun(x,xdata)-ydata、終了条件を記述する値 exitflag、および最適化プロセスに関する情報を含む構造体 output を返します。

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(___) は上記に加え、解 x におけるラグランジュ乗数をフィールドに含む構造体 lambda、および解 x における fun のヤコビアンを返します。

すべて折りたたむ

観測時間データ xdata および観測応答データ ydata について、次の形式のモデルが適合するパラメーター x(1) および x(2) を求めるものとします。

ydata=x(1)exp(x(2)xdata)

観測時間と応答を入力します。

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

単純な指数減衰モデルを作成します。

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

開始点 x0 = [100,-1] を使用してモデルを当てはめます。

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

データと当てはめた曲線をプロットします。

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

適合パラメーターに制約がある場合の、データへの最適な指数適合を求めます。

ノイズを含む指数減衰モデルからデータを生成します。モデルは次のとおりです。

y=exp(-1.3t)+ε

ここで、t の範囲は 0 ~ 3、ε は平均が 0、標準偏差が 0.05 の正規分布ノイズです。

rng default % for reproducibility
xdata = linspace(0,3);
ydata = exp(-1.3*xdata) + 0.05*randn(size(xdata));

問題は、データ (xdata, ydata) について、データに最も適合する指数減衰モデル y=x(1)exp(x(2)xdata) の検出です。パラメーターには以下の境界があります。

0x(1)3/4

-2x(2)-1.

lb = [0,-2];
ub = [3/4,-1];

モデルを作成します。

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

初期推定を作成します。

x0 = [1/2,-2];

有界適合問題を解きます。

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    0.7500   -1.0000

生成された曲線がどれだけ適切にデータに合っているかを検証します。制約によって解と実際の値に差が生じるため、この近似は最適なものではありません。

plot(xdata,ydata,'ko',xdata,fun(x,xdata),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

既定の 'trust-region-reflective' アルゴリズムと 'levenberg-marquardt' アルゴリズムによる適合の結果を比較します。

観測時間データ xdata および観測応答データ ydata について、次の形式のモデルが適合するパラメーター x(1) および x(2) を求めるものとします。

ydata=x(1)exp(x(2)xdata)

観測時間と応答を入力します。

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

単純な指数減衰モデルを作成します。

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

開始点 x0 = [100,-1] を使用してモデルを当てはめます。

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

この解を 'levenberg-marquardt' による近似と比較します。

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
Local minimum possible.
lsqcurvefit stopped because the relative size of the current step is less than
the value of the step size tolerance.
x = 1×2

  498.8309   -0.1013

2 つのアルゴリズムが同じ解に収束しています。データと当てはめた指数モデルをプロットします。

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

既定の 'trust-region-reflective' アルゴリズムと 'levenberg-marquardt' アルゴリズムによる適合の結果を比較します。解法プロセスを検証して、この場合にどちらがより効率的かを確認します。

観測時間データ xdata および観測応答データ ydata について、次の形式のモデルが適合するパラメーター x(1) および x(2) を求めるものとします。

ydata=x(1)exp(x(2)xdata)

観測時間と応答を入力します。

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

単純な指数減衰モデルを作成します。

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

開始点 x0 = [100,-1] を使用してモデルを当てはめます。

x0 = [100,-1];
[x,resnorm,residual,exitflag,output] = lsqcurvefit(fun,x0,xdata,ydata);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

この解を 'levenberg-marquardt' による近似と比較します。

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
[x2,resnorm2,residual2,exitflag2,output2] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);
Local minimum possible.
lsqcurvefit stopped because the relative size of the current step is less than
the value of the step size tolerance.

これらの解は等価でしょうか。

norm(x-x2)
ans = 2.0632e-06

これらの解は等価です。

解が得られるまでの関数評価の回数が少ないのは、どちらのアルゴリズムでしょうか。

fprintf(['The ''trust-region-reflective'' algorithm took %d function evaluations,\n',...
   'and the ''levenberg-marquardt'' algorithm took %d function evaluations.\n'],...
   output.funcCount,output2.funcCount)
The 'trust-region-reflective' algorithm took 87 function evaluations,
and the 'levenberg-marquardt' algorithm took 72 function evaluations.

データと当てはめた指数モデルをプロットします。

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

適切に近似されているように見えます。残差の大きさはどの程度でしょうか。

fprintf(['The ''trust-region-reflective'' algorithm has residual norm %f,\n',...
   'and the ''levenberg-marquardt'' algorithm has residual norm %f.\n'],...
   resnorm,resnorm2)
The 'trust-region-reflective' algorithm has residual norm 9.504887,
and the 'levenberg-marquardt' algorithm has residual norm 9.504887.

入力引数

すべて折りたたむ

当てはめる関数。関数ハンドルまたは関数名として指定されます。fun は 2 つの入力、ベクトルまたは行列 x とベクトルまたは行列 xdata を取る関数です。fun はベクトルまたは行列 F を返しますが、これは xxdata で評価される目的関数です。関数 fun は関数ファイルの関数ハンドルとして指定することができます。

x = lsqcurvefit(@myfun,x0,xdata,ydata)

ここで myfun は次のような MATLAB® 関数です。

function F = myfun(x,xdata)
F = ...     % Compute function values at x, xdata

fun は無名関数の関数ハンドルにもなります。

f = @(x,xdata)x(1)*xdata.^2+x(2)*sin(xdata);
x = lsqcurvefit(f,x0,xdata,ydata);

xF のユーザー定義の値が配列である場合、線形インデックスを使用してベクトルに変換されます (配列インデックス付け (MATLAB)を参照)。

メモ:

fun は二乗和 sum((fun(x,xdata)-ydata).^2) ではなく、fun(x,xdata) を返します。lsqcurvefitfun(x,xdata)-ydata の要素の二乗和を暗黙的に計算します。詳細は、を参照してください。

ヤコビアンを計算することができ、"さらに" ヤコビ オプションが 'on' である場合、

options = optimoptions('lsqcurvefit','SpecifyObjectiveGradient',true)

関数 fun は 2 番目の出力引数に x でのヤコビ値 J (行列) を返さなければなりません。nargout の値を確認することで、1 つの出力引数のみの場合 (最適化アルゴリズムが J ではなく F の値のみを必要とする場合)、fun が呼び出されるときに J の演算を避けることができます。

function [F,J] = myfun(x,xdata)
F = ...          % objective function values at x
if nargout > 1   % two output arguments
   J = ...   % Jacobian of the function evaluated at x
end

funm 個の要素をもつベクトル (行列) を返し、xn 個の要素をもつ場合 (ここで、nx0 の要素数)、ヤコビアン Jmn 列の行列になります。ここで、J(i,j)F(i)x(j) に関する偏導関数です (ヤコビアン J は、F の勾配の転置であることに注意してください)。詳細は、ベクトルと行列の目的関数の記述を参照してください。

例: @(x,xdata)x(1)*exp(-x(2)*xdata)

データ型: char | function_handle | string

初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0 の要素数および x0 のサイズを使用して、fun が受け入れる変数の数およびサイズを決定します。

例: x0 = [1,2,3,4]

データ型: double

モデルの入力データ。実数ベクトルまたは実数配列として指定されます。モデルは次のとおりです。

ydata = fun(x,xdata)

ここで、xdata および ydata は固定配列、x は二乗和の最小値の探索のために lsqcurvefit によって変更されるパラメーターの配列です。

例: xdata = [1,2,3,4]

データ型: double

モデルの応答データ。実数ベクトルまたは実数配列として指定されます。モデルは次のとおりです。

ydata = fun(x,xdata)

ここで、xdata および ydata は固定配列、x は二乗和の最小値の探索のために lsqcurvefit によって変更されるパラメーターの配列です。

ydata 配列のサイズおよび形状は、配列 fun(x0,xdata) と同じでなければなりません。

例: ydata = [1,2,3,4]

データ型: double

下限。実数ベクトルまたは実数配列として指定されます。x0 の要素数と lb の要素数が等しい場合、lb は次を指定します。

x(i) >= lb(i) (すべての i について)

numel(lb) < numel(x0) の場合、lb は次を指定します。

x(i) >= lb(i) (1 <= i <= numel(lb))

x0 より lb の要素数が少ない場合、ソルバーは警告を生成します。

例: x のすべての成分が正であることを指定するには、lb = zeros(size(x0)) を使用します。

データ型: double

実数ベクトルまたは実数配列として指定される上限です。x0 の要素数と ub の要素数が等しい場合、ub は次を指定します。

x(i) <= ub(i) (すべての i について)

numel(ub) < numel(x0) の場合、ub は次を指定します。

x(i) <= ub(i) (1 <= i <= numel(ub))

x0 より ub の要素数が少ない場合、ソルバーは警告を生成します。

例: x のすべての成分が 1 未満であることを指定するには、ub = ones(size(x0)) を使用します。

データ型: double

最適化オプション。optimoptions の出力、または optimset などによって返される構造体として指定されます。

いくつかのオプションはすべてのアルゴリズムに適用することができ、その他のオプションは特定のアルゴリズムに関連します。詳細は、最適化オプション リファレンスを参照してください。

一部のオプションは、optimoptions に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細は、表示オプションを参照してください。

すべてのアルゴリズム

Algorithm

'trust-region-reflective' (既定の設定) と 'levenberg-marquardt' から選択します。

Algorithm オプションは使用するアルゴリズムの優先順位を指定します。これは設定のみです。条件によっては、各アルゴリズムに対応しなければならないからです。信頼領域 Reflective 法アルゴリズムでは、非線形方程式系は劣決定では解けません。すなわち、方程式の数 (fun によって返される F の要素数) は少なくとも x の長さと同じでなければなりません。レーベンバーグ・マルカート アルゴリズムは範囲制約を処理しません。アルゴリズムの選択についての詳細は、アルゴリズムの選択を参照してください。

CheckGradients

ユーザー設定の導関数 (目的関数または制約の勾配) と有限差分による導関数とを比較します。選択肢は、false (既定の設定) または true です。

optimset の場合、名前は DerivativeCheck で、値は 'on' または 'off' です。詳細は、オプション名の新旧対照表を参照してください。

Diagnostics

最小化または計算する関数に関する情報を表示します。選択肢は、'off' (既定の設定) または 'on' です。

DiffMaxChange

有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は Inf です。

DiffMinChange

有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は 0 です。

Display

表示レベル (反復表示を参照):

  • 'off' または 'none' — 出力を表示しない。

  • 'iter' — 各反復の出力を表示し、既定の終了メッセージを与える。

  • 'iter-detailed' — 各反復の出力を表示し、技術的な終了メッセージを与える。

  • 'final' (既定の設定) — 最終出力を表示し、既定の終了メッセージを返す。

  • 'final-detailed' — 最終出力のみを表示し、技術的な終了メッセージを与える。

FiniteDifferenceStepSize

有限差分のスカラーまたはベクトルのステップ サイズ ファクター。FiniteDifferenceStepSize をベクトル v に設定すると、前方有限差分 delta

delta = v.*sign′(x).*max(abs(x),TypicalX);

ここで、sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分法では

delta = v.*max(abs(x),TypicalX);

スカラー FiniteDifferenceStepSize はベクトルに拡張します。既定値は、前進有限差分法では sqrt(eps)、中心有限差分法では eps^(1/3) です。

optimset の場合、名前は FinDiffRelStep です。詳細は、オプション名の新旧対照表を参照してください。

FiniteDifferenceType

勾配推定に使用される有限差分は 'forward' (既定の設定) または 'central' (中心) のいずれかです。'central' では 2 倍の関数評価が必要になりますが、正確性が増します。

アルゴリズムは有限差分の両方のタイプを推定するとき、範囲に注意深く従います。そのためたとえば、forward ではなく、backward を選択すると、範囲外の点を計算しないようにすることができます。

optimset の場合、名前は FinDiffType です。詳細は、オプション名の新旧対照表を参照してください。

FunctionTolerance

関数値に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolFun です。詳細は、オプション名の新旧対照表を参照してください。

FunValCheck

関数値が有効かどうかをチェックします。'on' は、関数が complexInf、または NaN である値を返すと、エラーを表示します。既定の 'off' ではエラーを表示しません。

MaxFunctionEvaluations

可能な関数評価の最大回数 (正の整数)。既定の設定は 100*numberOfVariables です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

optimset の場合、名前は MaxFunEvals です。詳細は、オプション名の新旧対照表を参照してください。

MaxIterations

可能な反復の最大数 (正の整数)。既定値 400 です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

optimset の場合、名前は MaxIter です。詳細は、オプション名の新旧対照表を参照してください。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、1 次の最適性の尺度を参照してください。

内部的に、'levenberg-marquardt' アルゴリズムは、FunctionTolerance1e-4 倍となる最適性の許容誤差 (停止条件) を使用し、OptimalityTolerance は使用しません。

optimset の場合、名前は TolFun です。詳細は、オプション名の新旧対照表を参照してください。

OutputFcn

各反復で最適化関数が呼び出すユーザー定義の関数を 1 つ以上指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ([]) です。詳細は、出力関数の構文を参照してください。

PlotFcn

アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。名前、関数ハンドル、または名前か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし ([]) です。

  • 'optimplotx' は現在の点をプロットします。

  • 'optimplotfunccount' は関数計算をプロットします。

  • 'optimplotfval' は関数値をプロットします。

  • 'optimplotresnorm' は残差のノルムをプロットします。

  • 'optimplotstepsize' はステップ サイズをプロットします。

  • 'optimplotfirstorderopt' は 1 次の最適性尺度をプロットします。

カスタム プロット関数の記述については、プロット関数の構文を参照してください。

optimset の場合、名前は PlotFcns です。詳細は、オプション名の新旧対照表を参照してください。

SpecifyObjectiveGradient

false (既定の設定) の場合、ソルバーは有限差分法を使用してヤコビアンを近似します。true の場合、ソルバーは目的関数に対してユーザー定義のヤコビアン (既定の設定では fun)、または (JacobMult を使用するときの) ヤコビ情報を使用します。

optimset の場合、名前は Jacobian で、値は 'on' または 'off' です。詳細は、オプション名の新旧対照表を参照してください。

StepTolerance

x に関する許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolX です。詳細は、オプション名の新旧対照表を参照してください。

TypicalX

典型的な x の値です。TypicalX の要素数は、開始点 x0 の要素数と等しくなります。既定値は ones(numberofvariables,1) です。ソルバーは TypicalX を使用して勾配推定の有限差分をスケーリングします。

UseParallel

true の場合、ソルバーは並列で勾配を推定します。既定の false に設定すると、無効になります。詳細は、並列計算を参照してください。

信頼領域 Reflective 法アルゴリズム
JacobianMultiplyFcn

ヤコビ乗算関数。関数ハンドルとして指定されます。大規模構造化問題に対して、この関数は実際に J を計算しないで、ヤコビ行列乗算 J*YJ'*YJ'*(J*Y) のいずれかを計算します。この関数は次の形式を取ります。

W = jmfun(Jinfo,Y,flag) 

ここで、JinfoJ*Y (または J'*YJ'*(J*Y)) の計算に使用される行列を含んでいます。1 番目の引数 Jinfo は目的関数 fun が返す 2 番目の引数と同じにしなければなりません。

[F,Jinfo] = fun(x)

Y は問題の次元と同じ行数をもつ行列です。flag はどの乗数が計算されるかを決めます。

  • flag == 0 の場合、W = J'*(J*Y) です。

  • flag > 0 の場合、W = J*Y です。

  • flag < 0 の場合、W = J'*Y です。

どの場合でも、J は明示的に形成されません。ソルバーは Jinfo を使用して前提条件子を計算します。jmfun が必要とする追加のパラメーターを与える方法については 追加パラメーターの受け渡し を参照してください。

メモ:

'SpecifyObjectiveGradient'true に設定し、ソルバーが Jinfofun から jmfun に渡すようにしなければなりません。

同様の例は 密に構造化されたヘッシアンと線形等式を使用した最小化線形最小二乗付きヤコビ乗算関数 を参照してください。

optimset の場合、名前は JacobMult です。詳細は、オプション名の新旧対照表を参照してください。

JacobPattern

有限差分に対するヤコビ スパース パターン。fun(i)x(j) によって異なる場合、JacobPattern(i,j) = 1 を設定します。それ以外の場合は、JacobPattern(i,j) = 0 を設定します。言い換えると、∂fun(i)/∂x(j) ≠ 0 をもつことができる場合、JacobPattern(i,j) = 1 となります。

fun でヤコビ行列 J を計算するのが不便な場合は、JacobPattern を使用します。ただし、fun(i)x(j) によって異なる場合は見ただけで判断できます。JacobPattern を提供できる場合、ソルバーはスパース有限差分を使って J を近似することができます。

構造が不明であれば、JacobPattern を設定しないでください。既定では、JacobPattern は 1 からなる密行列のように動作します。その後、ソルバーは、非スパース状態の有限差分近似を反復ごとに計算します。大規模な問題では、この計算には多大なリソースが必要となる場合があり、通常はスパース構造を決定するのが妥当です。

MaxPCGIter

PCG (前処理付き共役勾配) 法の反復の最大回数です (正のスカラー)。既定値は max(1,numberOfVariables/2) です。詳細は、大規模な非線形最小二乗法を参照してください。

PrecondBandWidth

PCG に対する前提条件子の帯域幅の上限 (非負の整数)。既定の PrecondBandWidthInf の場合、共役勾配 (CG) ではなく、直接因子分解 (コレスキー因子) が使用されます。直接因子分解では CG より計算量が増加しますが、解を求めるためのステップの質が向上します。対角型をした前提条件のために、PrecondBandWidth0 に設定します (上部帯域幅 0)。一部の問題では帯域幅を中間にすることで PCG 法の反復回数を減らします。

SubproblemAlgorithm

反復ステップの計算方法を定義します。既定の設定である 'factorization' のステップは 'cg' より低速ですが、精度の点で勝ります。詳細は、信頼領域 Reflective 法の最小二乗を参照してください。

TolPCG

PCG 反復に関する終了許容誤差 (正のスカラー)。既定値は 0.1 です。

レーベンバーグ・マルカート法アルゴリズム
InitDamping

レーベンバーグ・マルカート パラメーターの初期値 (正のスカラー)。既定値は 1e-2 です。詳細は、レーベンバーグ・マルカート法を参照してください。

ScaleProblem

'jacobian' は、適切にスケール化されていない問題に対して収束性を高める場合があります。既定値は 'none' です。

例: options = optimoptions('lsqcurvefit','FiniteDifferenceType','central')

次のフィールドをもつ構造体として指定される問題構造体です。

フィールド名エントリ

objective

xxdata の目的関数

x0

x の初期点、有効制約法アルゴリズムのみ

xdata

目的関数の入力データ

ydata

目的関数に一致させる出力データ
lb下限のベクトル
ub上限のベクトル

solver

'lsqcurvefit'

options

optimoptions で作成されたオプション

problem 構造体では、少なくとも objectivex0solverxdataydata、および options フィールドを指定しなければなりません。

problem 構造体を取得する最も簡単な方法は、最適化アプリから問題をエクスポートすることです。

データ型: struct

出力引数

すべて折りたたむ

実数ベクトルまたは実数配列として返される解です。x のサイズは、x0 のサイズと同じです。通常、exitflag が正の場合、x は問題に対する局所的な解になります。解の質に関する詳細は、ソルバーが成功する場合 を参照してください。

残差の 2 乗ノルム。非負の実数として返されます。resnorm は、x における残差の二乗した 2 ノルム (sum((fun(x,xdata)-ydata).^2)) です。

解での目的関数の値。配列として返されます。一般的に、residual = fun(x,xdata)-ydata になります。

ソルバーの停止理由。整数として返されます。

1

関数が解 x に収束したことを示します。

2

x の変位が指定した許容誤差より小さくなったことを示します。

3

残差の変化が指定した許容誤差より小さくなったことを示します。

4

探索方向の大きさが指定した許容誤差より小さくなったことを示します。

0

反復回数が options.MaxIterations を超過、または関数評価の回数が options.MaxFunctionEvaluations を超過しています。

-1

アルゴリズムが出力関数により停止したことを示します。

-2

問題が実行不可能です。範囲 lbub が適切ではありません。

最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。

firstorderopt

1 次の最適性の尺度

iterations

実行した反復回数

funcCount

関数評価回数です。

cgiterations

PCG 法の合計反復回数 (信頼領域 Reflective 法アルゴリズムのみ)

stepsize

x の最終変位

algorithm

使用される最適化アルゴリズム

message

終了メッセージ

解におけるラグランジュ乗数。次のフィールドをもつ構造体として返されます。

lower

下限 lb

upper

上限 ub

解におけるヤコビアン。実数行列として返されます。jacobian(i,j) は、解 x での x(j) に関する fun(i) の偏導関数です。

制限

  • レーベンバーグ・マルカート アルゴリズムは範囲制約を処理しません。

  • 信頼領域 Reflective 法アルゴリズムは劣決定システムを扱いません。方程式の数、つまり F の行数が少なくとも変数の数と同じである必要があります。劣決定の場合、lsqcurvefit はレーベンバーグ・マルカート法アルゴリズムを使用します。

    信頼領域 Reflective 法アルゴリズムは劣決定システムを取り扱わず、レーベンバーグ・マルカート法は範囲制約を取り扱わないため、これらの両方の特性をもつ問題を lsqcurvefit で解くことはできません。

  • lsqcurvefitlevenberg-marquardt アルゴリズムを使用して複素数値の問題を直接解くことができます。ただし、このアルゴリズムは範囲制約を受け付けません。範囲制約をもつ複素数の問題では、変数を実数部と虚数部に分割して trust-region-reflective アルゴリズムを使用します。詳細は、複素数値データへのモデルの当てはめを参照してください。

  • 信頼領域 Reflective 法の前処理を使用した共役勾配法で使用される前提条件子の計算では、その計算の前に JTJ (J はヤコビ行列) を作成します。そのため多くの非ゼロ要素をもつ J の行は、密行列の積 JTJ に近い結果になり、大規模な問題についてはかなりのコストを要する解法プロセスになる場合があります。

  • x の構成要素に上限 (または下限) がない場合、lsqcurvefit では非常に大きい任意の正の値 (下限に対しては負の値) を設定する代わりに、inf (下限に対しては -inf) を ub (または lb) の対応する構成要素に設定する方がより適切です。

lsqnonlinlsqcurvefitfsolve の信頼領域 Reflective 法アルゴリズムは、fun でヤコビアンを計算せずに、あるいはヤコビ スパース パターンを提示せずに、小規模から中規模の問題で使用できます (これは、ヘッシアンの計算やヘッセ スパース パターンの入力なしで、fmincon または fminunc を使用する場合にも適用されます)。小、中規模問題とは、どのくらい小さいのでしょうか。絶対的な答えはありません。ご利用のコンピューター システムの構成における仮想メモリ量によって異なるからです。

m 個の方程式と n 個の未知数の問題を考えてみましょう。コマンド J = sparse(ones(m,n))Out of memory エラーを引き起こす場合は、間違いなく大きな問題が発生しています。エラーが発生しない場合でも、問題の規模が大きすぎる場合があります。判定するには、問題を実行して MATLAB がシステムで使用可能な仮想メモリ内で実行されるかどうかを確認します。

アルゴリズム

レーベンバーグ・マルカート法および信頼領域 Reflective 法は、fsolve にも使用される非線形最小二乗アルゴリズムに基づいています。

  • 既定の信頼領域 Reflective 法アルゴリズムは部分空間の信頼領域法であり、[1] および [2] で説明する interior-reflective ニュートン法に基づいています。各反復は、前処理付き共役勾配 (PCG) 法を使用する大型線形システムの近似解を伴います。詳細は、信頼領域 Reflective 法の最小二乗を参照してください。

  • レーベンバーグ・マルカート法は [4][5][6] の参考文献で説明されています。詳細は、レーベンバーグ・マルカート法を参照してください。

参照

[1] Coleman, T.F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[2] Coleman, T.F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[3] Dennis, J. E. Jr. “Nonlinear Least-Squares.” State of the Art in Numerical Analysis, ed. D. Jacobs, Academic Press, pp. 269–312.

[4] Levenberg, K. “A Method for the Solution of Certain Problems in Least-Squares.” Quarterly Applied Mathematics 2, 1944, pp. 164–168.

[5] Marquardt, D. “An Algorithm for Least-squares Estimation of Nonlinear Parameters.” SIAM Journal Applied Mathematics, Vol. 11, 1963, pp. 431–441.

[6] Moré, J. J. “The Levenberg-Marquardt Algorithm: Implementation and Theory.” Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics 630, Springer Verlag, 1977, pp. 105–116.

[7] Moré, J. J., B. S. Garbow, and K. E. Hillstrom. User Guide for MINPACK 1. Argonne National Laboratory, Rept. ANL–80–74, 1980.

[8] Powell, M. J. D. “A Fortran Subroutine for Solving Systems of Nonlinear Algebraic Equations.” Numerical Methods for Nonlinear Algebraic Equations, P. Rabinowitz, ed., Ch.7, 1970.

拡張機能

R2006a より前に導入