ドキュメンテーション

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

lsqnonlin

非線形最小二乗 (非線形データ近似) 問題を解く

非線形最小二乗ソルバー

次の形式の非線形最小二乗曲線近似の問題を解きます。

minxf(x)22=minx(f1(x)2+f2(x)2+...+fn(x)2)

x の成分には、オプションの下限 lb と上限 ub があります。

x、lb および ub はベクトルまたは行列とすることができます。行列引数を参照してください。

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

f(x)=[f1(x)f2(x)fn(x)].

構文

  • x = lsqnonlin(fun,x0)
  • x = lsqnonlin(fun,x0,lb,ub)
  • x = lsqnonlin(fun,x0,lb,ub,options)
  • x = lsqnonlin(problem)
  • [x,resnorm] = lsqnonlin(___)
  • [x,resnorm,residual,exitflag,output] = lsqnonlin(___)
  • [x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(___)

説明

x = lsqnonlin(fun,x0) は、点 x0 を開始点として、fun に記述する関数の二乗和の最小値を求めます。関数 fun は、値の二乗和ではなく値のベクトルを返します (アルゴリズムは fun(x) の要素の二乗和を暗黙的に計算します)。

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

    メモ:   問題の指定された入力範囲に矛盾がない場合、出力 xx0、出力 resnormresidual[] です。

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

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

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

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

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

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

すべて折りたたむ

単純な指数減衰曲線をデータに近似します。

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

$$ y = \exp(-1.3t) + \varepsilon$$

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

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

問題は、データ (dy) について、データを最もよく近似する指数減衰率の検出です。

指数減衰率の値 $r$ を使用して、その減衰率とデータをもつモデルとの差のベクトルを返す、無名関数を作成します。

fun = @(r)exp(-d*r)-y;

最適な減衰率の値を求めます。任意の初期推定 x0 = 4 を選択します。

x0 = 4;
x = lsqnonlin(fun,x0)
Local minimum possible.

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




x =

    1.2645

データおよび最適近似指数曲線をプロットします。

plot(d,y,'ko',d,exp(-x*d),'b-')
legend('Data','Best fit')
xlabel('t')
ylabel('exp(-tx)')

一部の近似パラメーターに制約がある場合の最適近似モデルを求めます。

次の関数のセンタリング $b$ およびスケーリング $a$ による最適な近似が

$$a\exp(-t)\exp(-\exp(-(t-b)))$$

次の標準正規密度に対して成り立つようにします。

$$\frac{1}{\sqrt{2\pi}}\exp\left(-t^2/2\right)$$

データ点のベクトル t、およびこれらの点の対応する正規密度を作成します。

t = linspace(-4,4);
y = 1/sqrt(2*pi)*exp(-t.^2/2);

センタリングおよびスケーリングした関数と、正規の y との差を評価する関数を作成します。ここで、x(1) はスケーリング $a$x(2) はセンタリング $b$ です。

fun = @(x)x(1)*exp(-t).*exp(-exp(-(t-x(2)))) - y;

x0 = [1/2,0] から開始して、最適近似を求めます。スケーリング $a$ は 1/2 ~ 3/2、センタリング $b$ は -1 ~ 3 とします。

lb = [1/2,-1];
ub = [3/2,3];
x0 = [1/2,0];
x = lsqnonlin(fun,x0,lb,ub)
Local minimum possible.

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




x =

    0.8231   -0.2444

2 つの関数をプロットして、近似の質を確認します。

plot(t,y,'r-',t,fun(x)+y,'b-')
xlabel('t')
legend('Normal density','Fitted function')

異なる lsqnonlin アルゴリズムを使用して、データ近似の問題の結果を比較します。

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

$$ \hbox{ydata} = x(1)\exp\left(x(2)\hbox{xdata}\right)$$

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

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)x(1)*exp(x(2)*xdata)-ydata;

開始点 x0 = [100,-1] を使用してモデルを近似します。まず、既定の 'trust-region-reflective' アルゴリズムを使用します。

x0 = [100,-1];
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective');
x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible.

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




x =

  498.8309   -0.1013

'levenberg-marquardt アルゴリズムを使用する場合と違いがあるかどうか確認します。

options.Algorithm = 'levenberg-marquardt';
x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible.

lsqnonlin stopped because the relative size of the current step is less than
the default value of the step size tolerance.




x =

  498.8309   -0.1013

2 つのアルゴリズムで同じ解が得られています。解とデータをプロットします。

plot(xdata,ydata,'ko')
hold on
tlist = linspace(xdata(1),xdata(end));
plot(tlist,x(1)*exp(x(2)*tlist),'b-')
xlabel xdata
ylabel ydata
title('Exponential Fit to Data')
legend('Data','Exponential Fit')
hold off

次を最小にする x を求めます。

k=110(2+2kekx1ekx2)2,

また、二乗和の最小値を求めます。

lsqnonlin は二乗和がユーザー関数で陽的に作成されて "いない" ことを想定しているため、lsqnonlin に渡す関数が以下のベクトル値関数を代わりに演算しなければなりません。

Fk(x)=2+2kekx1ekx2,

k = 1 から 10 までです (すなわち、F10 個の要素をもちます)。

まず、10 要素からなるベクトル F を計算するファイルを記述します。

function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));

x0 = [0.3,0.4] を開始点として、最小化点および最小値を求めます。

x0 = [0.3,0.4];
[x,resnorm] = lsqnonlin(@myfun,x0);

ここでは、約 24 回の関数評価の後、次の解を出力します。

x,resnorm
x = 
     0.2578   0.2578

resnorm = 
     124.3622

解法プロセスの発生時 (Display オプションを 'iter' に設定する)、およびその後 (output 構造体を調べる) の解法プロセスを検証します。

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

$$ \hbox{ydata} = x(1)\exp\left(x(2)\hbox{xdata}\right)$$

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

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)x(1)*exp(x(2)*xdata)-ydata;

開始点 x0 = [100,-1] を使用してモデルを近似します。Display オプションを 'iter' に設定して、解法プロセスを検証します。output 構造体を取得し、解法プロセスの詳細情報を取得します。

x0 = [100,-1];
options = optimoptions('lsqnonlin','Display','iter');
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          3          359677                      2.88e+04
Objective function returned Inf; trying a new point...
     1          6          359677        11.6976       2.88e+04      
     2          9          321395            0.5       4.97e+04      
     3         12          321395              1       4.97e+04      
     4         15          292253           0.25       7.06e+04      
     5         18          292253            0.5       7.06e+04      
     6         21          270350          0.125       1.15e+05      
     7         24          270350           0.25       1.15e+05      
     8         27          252777         0.0625       1.63e+05      
     9         30          252777          0.125       1.63e+05      
    10         33          243877        0.03125       7.48e+04      
    11         36          243660         0.0625        8.7e+04      
    12         39          243276         0.0625          2e+04      
    13         42          243174         0.0625       1.14e+04      
    14         45          242999          0.125        5.1e+03      
    15         48          242661           0.25       2.04e+03      
    16         51          241987            0.5       1.91e+03      
    17         54          240643              1       1.04e+03      
    18         57          237971              2       3.36e+03      
    19         60          232686              4       6.04e+03      
    20         63          222354              8        1.2e+04      
    21         66          202592             16       2.25e+04      
    22         69          166443             32       4.05e+04      
    23         72          106320             64       6.68e+04      
    24         75         28704.7            128       8.31e+04      
    25         78         89.7947        140.674       2.22e+04      
    26         81         9.57381        2.02599            684      
    27         84         9.50489      0.0619927           2.27      
    28         87         9.50489    0.000462262         0.0114      

Local minimum possible.

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



出力構造体を検証し、解法プロセスの詳細情報を取得します。

output
output = 

    firstorderopt: 0.0114
       iterations: 28
        funcCount: 87
     cgiterations: 0
        algorithm: 'trust-region-reflective'
         stepsize: 4.6226e-04
          message: 'Local minimum possible....'

比較のために、Algorithm オプションを 'levenberg-marquardt' に設定します。

options.Algorithm = 'levenberg-marquardt';
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                        First-Order                    Norm of 
 Iteration  Func-count    Residual       optimality      Lambda           step
     0           3          359677        2.88e+04         0.01
Objective function returned Inf; trying a new point...
     1          13          340761        3.91e+04       100000       0.280777
     2          16          304661        5.97e+04        10000       0.373146
     3          21          297292        6.55e+04        1e+06      0.0589933
     4          24          288240        7.57e+04       100000      0.0645444
     5          28          275407        1.01e+05        1e+06      0.0741266
     6          31          249954        1.62e+05       100000       0.094571
     7          36          245896        1.35e+05        1e+07      0.0133606
     8          39          243846        7.26e+04        1e+06      0.0094431
     9          42          243568        5.66e+04       100000      0.0082162
    10          45          243424        1.61e+04        10000     0.00777935
    11          48          243322         8.8e+03         1000      0.0673933
    12          51          242408         5.1e+03          100       0.675209
    13          54          233628        1.05e+04           10        6.59804
    14          57          169089        8.51e+04            1        54.6992
    15          60         30814.7        1.54e+05          0.1        196.939
    16          63         147.496           8e+03         0.01        129.795
    17          66         9.51503             117        0.001        9.96069
    18          69         9.50489          0.0714       0.0001       0.080486
    19          72         9.50489        4.86e-05        1e-05    5.07037e-05

Local minimum possible.

lsqnonlin stopped because the relative size of the current step is less than
the default value of the step size tolerance.



'levenberg-marquardt' の方が少ない反復回数で収束していますが、関数評価の回数はほぼ同じです。

output
output = 

       iterations: 19
        funcCount: 72
         stepsize: 5.0704e-05
     cgiterations: []
    firstorderopt: 4.8597e-05
        algorithm: 'levenberg-marquardt'
          message: 'Local minimum possible....'

関連する例

入力引数

すべて折りたたむ

二乗和が最小化される関数。関数ハンドルまたは関数名として指定されます。fun は、ベクトル x を受け、x で評価される目的関数であるベクトル F を返す関数です。関数 fun はファイルへの関数ハンドルとして指定することができます。

x = lsqnonlin(@myfun,x0)

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

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

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

x = lsqnonlin(@(x)sin(x.*x),x0);

xF のユーザー定義の値が行列の場合、「線形インデックス」を使用してベクトルに変換されます。

    メモ:   二乗和を明示的に形成すべきではありません。その代わりに、関数が関数値のベクトルを戻すべきです。詳細は、を参照してください。

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

options = optimoptions('lsqnonlin','Jacobian','on')

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

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

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

例: @(x)cos(x).*exp(-x)

データ型: char | function_handle

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

例: x0 = [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))

この場合、ソルバーによって警告が発行されます。

例: すべての 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))

この場合、ソルバーによって警告が発行されます。

例: すべての x 成分が 1 未満になるように指定するため、ub = ones(size(x0)) とします。

データ型: double

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

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

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

すべてのアルゴリズム

Algorithm

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

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

CheckGradients

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

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) です。

FiniteDifferenceType

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

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

FunctionTolerance

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

FunValCheck

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

MaxFunctionEvaluations

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

MaxIterations

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

OptimalityTolerance

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

OutputFcn

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

PlotFcn

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

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

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

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

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

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

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

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

SpecifyObjectiveGradient

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

StepTolerance

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

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 に渡すようにしなければなりません。

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

 
 
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('lsqnonlin','FiniteDifferenceType','central')

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

フィールド名エントリ

objective

目的関数

x0

x の初期点
lb下限のベクトル
ub上限のベクトル

solver

'lsqnonlin'

options

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

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

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

データ型: struct

出力引数

すべて折りたたむ

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

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

解での目的関数の値。ベクトルとして返されます。一般的に、residual = fun(x) になります。

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

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 の行数が少なくとも変数の数と同じである必要があります。劣決定の場合、lsqnonlin はレーベンバーグ・マルカート法アルゴリズムを使用します。

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

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

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

  • x の構成要素に上限 (または下限) がない場合、lsqnonlin では非常に大きい任意の正の値 (下限に対しては負の値) を設定する代わりに、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 より前に導入

この情報は役に立ちましたか?