Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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) は、点 x0 を開始点として、fun に記述する関数の二乗和の最小値を求めます。関数 fun は、値の二乗和ではなく値のベクトル (または配列) を返します。(アルゴリズムは fun(x) の要素の二乗和を暗黙的に計算します。)

メモ

追加パラメーターの受け渡し は必要に応じて他のパラメーターを関数 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 の最小値を求めます。

[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)+ε,

ここで、t の範囲は 0 ~ 3、ε は平均が 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 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)')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Data, Best fit.

適合パラメーターの一部が有界である場合の最適適合モデルを求めます。

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

aexp(-t)exp(-exp(-(t-b)))

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

12πexp(-t2/2).

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

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

センタリングおよびスケーリングした関数と、正規の y との差を評価する関数を作成します。ここで、x(1) はスケーリング ax(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 value of the function tolerance.
x = 1×2

    0.8231   -0.2444

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

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

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Normal density, Fitted function.

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

観測時間データ 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)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 value of the function tolerance.
x = 1×2

  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 value of the step size tolerance.
x = 1×2

  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

Figure contains an axes object. The axes object with title Exponential Fit to Data contains 2 objects of type line. These objects represent Data, Exponential Fit.

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

k=110(2+2k-ekx1-ekx2)2,

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

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

Fk(x)=2+2k-ekx1-ekx2,

ここで、k=110 です (すなわち、F10 個の要素をもたなければなりません)。

関数 myfun (この例の終わりに掲載) が、10 要素のベクトル F を計算します。

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

x0 = [0.3,0.4];
[x,resnorm] = lsqnonlin(@myfun,x0)
Local minimum possible.
lsqnonlin stopped because the size of the current step is less than
the value of the step size tolerance.
x = 1×2

    0.2578    0.2578

resnorm = 124.3622

resnorm 出力は 2 乗残差ノルム、すなわち関数値の二乗和です。

次の関数は、ベクトル値目的関数を計算します。

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

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

観測時間データ 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)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.000462261         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 value of the function tolerance.

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

output
output = struct with fields:
    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.00944311
     9          42          243568        5.66e+04       100000     0.00821622
    10          45          243424        1.61e+04        10000     0.00777936
    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.96e-05        1e-05    5.07028e-05

Local minimum possible.
lsqnonlin stopped because the relative size of the current step is less than
the value of the step size tolerance.

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

output
output = struct with fields:
       iterations: 19
        funcCount: 72
         stepsize: 5.0703e-05
     cgiterations: []
    firstorderopt: 4.9629e-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);

lsqnonlin は、x0 引数の形式で x を目的関数に渡します。たとえば、x0 が 5 行 3 列の配列の場合、lsqnonlin は 5 行 3 列の配列として xfun に渡します。

メモ:

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

ヤコビアンも計算することができ、"さらに" 下式で設定された 'SpecifyObjectiveGradient' オプションが true である場合を考えます。

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

関数 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 個の成分をもつ配列を返し、xn 個の要素をもつ場合 (ここで、nx0 の要素数)、ヤコビアン Jmn 列の行列になります。ここで、J(i,j)F(i)x(j) における偏導関数です。(ヤコビアン J は、F の勾配の転置であることに注意してください。)

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

データ型: char | function_handle | string

初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0 の要素数および 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))

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

例: 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))

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

例: 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

可能な関数評価の最大回数 (正の整数)。既定の値は 'trust-region-reflective' アルゴリズムでは 100*numberOfVariables'levenberg-marquardt' アルゴリズムでは 200*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 次の最適性尺度をプロットします。

カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細は、Optimization Toolbox の出力関数出力関数とプロット関数の構文を参照してください。

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

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

フィールド名エントリ

objective

目的関数

x0

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

solver

'lsqnonlin'

options

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

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

データ型: struct

出力引数

すべて折りたたむ

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

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

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

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

1

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

2

x の変化が指定された許容誤差を下回っているか、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 はレーベンバーグ・マルカート法アルゴリズムを使用します。

  • lsqnonlin は複素数値問題を直接解くことができます。範囲制約は複素数値に対して意味を持たないことに注意してください。範囲制約を使用した複素数問題では、変数を実数部と虚数部に分けます。詳細は、複素数値データへのモデルの当てはめを参照してください。

  • 信頼領域 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] の参考文献で説明されています。詳細は、レーベンバーグ・マルカート法を参照してください。

代替機能

アプリ

[最適化] ライブ エディター タスクが lsqnonlin にビジュアル インターフェイスを提供します。

参照

[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 より前に導入