Main Content

lsqnonlin

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

説明

非線形最小二乗ソルバー

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

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

以下の制約に従います。

lbxxubAxbAeqx=beqc(x)0ceq(x)=0.

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,A,b,Aeq,beq) は、線形制約を満たすように解を制約します。

A x ≤ b

Aeq x = beq.

x = lsqnonlin(fun,x0,lb,ub,A,b,Aeq,beq,nonlcon) は、関数 nonlcon(x) の非線形制約を満たすように解を制約します。nonlcon は 2 つの出力 cceq を返します。ソルバーは制約を満たそうとします。

c ≤ 0

ceq = 0.

x = lsqnonlin(fun,x0,lb,ub,options)x = lsqnonlin(fun,x0,lb,ub,A,b,Aeq,beq,nonlcon,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 with xlabel t, ylabel exp(-tx) contains 2 objects of type line. One or more of the lines displays its values using only markers 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 with xlabel t contains 2 objects of type line. These objects represent Normal density, Fitted function.

次の目的関数、二乗和について考えます。

k=110(2+2k+exp(kx1)+2exp(2kx22))2.

この目的関数のコードは、この例の終わりに関数 myfun として掲載しています。

線形制約 x1x22 に従ってこの関数を最小化します。この制約を x1-x220 として記述します。

A = [1 -1/2];
b = 0;

範囲 x10x20x12、および x24 を設定します。

lb = [0 0];
ub = [2 4];

最適化プロセスを点 x0 = [0.3 0.4] から開始します。

x0 = [0.3 0.4];

この問題には線形等式制約がありません。

Aeq = [];
beq = [];

最適化を実行します。

x = lsqnonlin(@myfun,x0,lb,ub,A,b,Aeq,beq)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2

    0.1695    0.3389

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

次の目的関数、二乗和について考えます。

k=110(2+2k+exp(kx1)+2exp(2kx22))2.

この目的関数のコードは、この例の終わりに関数 myfun として掲載しています。

非線形制約 sin(x1)cos(x2) に従ってこの関数を最小化します。この非線形制約関数のコードは、この例の終わりに関数 nlcon として掲載しています。

範囲 x10x20x12、および x24 を設定します。

lb = [0 0];
ub = [2 4];

最適化プロセスを点 x0 = [0.3 0.4] から開始します。

x0 = [0.3 0.4];

この問題には、線形制約がありません。

A = [];
b = [];
Aeq = [];
beq = [];

最適化を実行します。

x = lsqnonlin(@myfun,x0,lb,ub,A,b,Aeq,beq,@nlcon)
Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    0.2133    0.3266

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

function [c,ceq] = nlcon(x)
ceq = [];
c = sin(x(1)) - cos(x(2));
end

異なる 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, xlabel xdata, ylabel ydata contains 2 objects of type line. One or more of the lines displays its values using only markers 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      Resnorm            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....'
       bestfeasible: []
    constrviolation: []

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

options.Algorithm = 'levenberg-marquardt';
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                        First-order                     Norm of 
 Iteration  Func-count      Resnorm      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        5.23e-05        1e-05    5.07043e-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.0704e-05
       cgiterations: []
      firstorderopt: 5.2319e-05
          algorithm: 'levenberg-marquardt'
            message: 'Local minimum possible....'
       bestfeasible: []
    constrviolation: []

入力引数

すべて折りたたむ

二乗和が最小化される関数。関数ハンドルまたは関数名として指定します。'interior-point' アルゴリズムの場合、fun は関数ハンドルである必要があります。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

実数行列として指定される線形不等式制約です。AMN 列の行列で、M は不等式の数、N は変数の数 (x0 の要素数) です。大規模な問題の場合は、A をスパース行列として渡します。

AM 個の線形不等式を符号化します。

A*x <= b,

ここで、xN 個の変数 x(:) の列ベクトル、bM 個の要素をもつ列ベクトルです。

たとえば、次の不等式を考えてみましょう。

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

次の制約を入力することによって、不等式を指定します。

A = [1,2;3,4;5,6];
b = [10;20;30];

例: x の成分の和が 1 以下であることを指定するには、A = ones(1,N)b = 1 を使用します。

データ型: double

実数ベクトルで指定される線形不等式制約です。b は、行列 A に関連する M 要素ベクトルです。b を行ベクトルとして渡す場合、ソルバーは b を列ベクトル b(:) に内部的に変換します。大規模な問題の場合は、b をスパース ベクトルとして渡します。

bM 個の線形不等式を符号化します。

A*x <= b,

ここで、xN 個の変数 x(:) の列ベクトル、AMN 列の行列です。

たとえば、次の不等式を考えてみましょう。

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.

次の制約を入力することによって、不等式を指定します。

A = [1,2;3,4;5,6];
b = [10;20;30];

例: x の成分の和が 1 以下であることを指定するには、A = ones(1,N)b = 1 を使用します。

データ型: double

実数行列として指定される線形等式制約です。AeqMeN 列の行列で、Me は等式の数、N は変数の数 (x0 の要素数) です。大規模な問題の場合は、Aeq をスパース行列として渡します。

AeqMe 個の線形等式を符号化します。

Aeq*x = beq,

ここで、xN 個の変数 x(:) の列ベクトル、beqMe 個の要素をもつ列ベクトルです。

たとえば、次の不等式を考えてみましょう。

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

次の制約を入力することによって、不等式を指定します。

Aeq = [1,2,3;2,4,1];
beq = [10;20];

例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N)beq = 1 を使用します。

データ型: double

実数ベクトルで指定される線形等式制約です。beq は、行列 Aeq に関連する Me 要素ベクトルです。beq を行ベクトルとして渡す場合、ソルバーは beq を列ベクトル beq(:) に内部的に変換します。大規模な問題の場合は、beq をスパース ベクトルとして渡します。

beqMe 個の線形等式を符号化します。

Aeq*x = beq,

ここで、xN 個の変数 x(:) の列ベクトル、AeqMeN 列の行列です。

たとえば、次の等式を考えてみましょう。

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.

次の制約を入力することによって、等式を指定します。

Aeq = [1,2,3;2,4,1];
beq = [10;20];

例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N)beq = 1 を使用します。

データ型: double

非線形制約。関数ハンドルとして指定されます。nonlcon は、ベクトルまたは配列 x を受け、2 つの配列 c(x) および ceq(x) を返す関数です。

  • c(x) は、x での非線形不等式制約の配列です。lsqnonlin は次の条件を満たそうとします。

    c のすべてのエントリに対して c(x) <= 0(1)
  • ceq(x) は、x での非線形等式制約の配列です。lsqnonlin は次の条件を満たそうとします。

    ceq のすべてのエントリに対して ceq(x) = 0(2)

たとえば、

x = lsqnonlin(@myfun,x0,lb,ub,A,b,Aeq,beq,@mycon,options)

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

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.
また制約関数のヤコビアン (導関数) も計算することができ、"さらに" 次のように SpecifyConstraintGradient オプションが true である場合、
options = optimoptions('lsqnonlin','SpecifyConstraintGradient',true)
nonlcon は 3 番目および 4 番目の出力引数に c(x) のヤコビアン GC および ceq(x) のヤコビアン GCeq を返さなければなりません。ベクトル関数 F(x) のヤコビアン G(x) は以下です。

Gi,j(x)=Fi(x)xj.

GCGCeq はスパースか密である可能性があります。GCGCeq が大きく、比較的非零の項目が少ない場合は、それらをスパース行列として使用して、'interior-point' アルゴリズム内の実行時間とメモリを節約します。詳細については、非線形制約を参照してください。

データ型: function_handle

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

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

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

すべてのアルゴリズム

Algorithm

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

Algorithm オプションは使用するアルゴリズムの優先順位を指定します。これは基本設定のみです。条件によっては、各アルゴリズムに対応しなければならないからです。信頼領域 Reflective 法アルゴリズムでは、fun によって返される F の要素数は少なくとも x の長さと同じでなければなりません。

'interior-point' アルゴリズムは、線形制約または非線形制約がある問題を解決できる唯一のアルゴリズムです。これらの制約を問題に含め、アルゴリズムを指定していない場合、ソルバーは自動的に 'interior-point' アルゴリズムに切り替わります。'interior-point' アルゴリズムが、変更されたバージョンの fmincon 'interior-point' アルゴリズムを呼び出します。

アルゴリズムの選択の詳細については、アルゴリズムの選択を参照してください。

CheckGradients

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

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

CheckGradients オプションは将来のリリースで削除される予定です。導関数を確認するには、関数 checkGradients を使用します。

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'interior-point' アルゴリズムでは 3000 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

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

MaxIterations

可能な反復の最大数 (正の整数)。既定の値は、'trust-region-reflective' および 'levenberg-marquardt' アルゴリズムでは 400'interior-point' アルゴリズムでは 1000 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

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 に関する許容誤差 (正のスカラー)。既定の値は、'trust-region-reflective' および 'levenberg-marquardt' アルゴリズムでは 1e-6'interior-point' アルゴリズムでは 1e-10 です。詳細については、許容誤差と停止条件を参照してください。

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

TypicalX

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

UseParallel

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

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

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

W = jmfun(Jinfo,Y,flag)

ここで、JinfoJ*Y (または J'*YJ'*(J*Y)) の計算に役立つデータを含んでいます。lsqcurvefit の場合、この関数は次の形式を取ります。

W = jmfun(Jinfo,Y,flag,xdata)

ここで、xdataxdata 引数に渡されるデータです。

データ Jinfo は目的関数 fun で返される 2 番目の引数です。

[F,Jinfo] = fun(x)
% or [F,Jinfo] = fun(x,xdata)

lsqnonlin はデータ JinfoYflag、および lsqcurvefit の場合は xdata を渡し、関数 jmfun は次に示すように結果を計算します。Y は、サイズが flag の値によって決まる行列です。m は目的関数 fun の要素数を指定し、nx 内の問題変数の個数を指定するとします。ヤコビアンのサイズは、fun で説明されているように mn 列です。関数 jmfun は次のいずれかの結果を返します。

  • flag == 0 の場合、W = J'*(J*Y) で、Y のサイズは n2 列です。

  • flag > 0 の場合、W = J*Y で、Y のサイズは n1 列です。

  • flag < 0 の場合、W = J'*Y で、Y のサイズは m1 列です。

どの場合でも、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' です。

内点法アルゴリズム
BarrierParamUpdate

fmincon による範囲パラメーターの更新方法を指定します (fmincon の内点法アルゴリズムを参照)。以下のオプションがあります。

  • 'monotone' (既定の設定)

  • 'predictor-corrector'

このオプションは、ソルバーの速度と収束性に影響が及びますが、その影響の予測は困難です。

ConstraintTolerance

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

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

InitBarrierParam

初期境界値 (正のスカラー)。既定の 0.1 より大きい値を試すのに役立つ場合があります。特に、目的関数や制約関数が大きい場合役立ちます。

SpecifyConstraintGradient

ユーザーにより定義される非線形制約関数に対する勾配。既定の false に設定すると、lsqnonlin は有限差分の非線形制約の勾配を推定します。nonlcon で説明するように、lsqnonlin は、true に設定されると、制約関数が 4 つの出力をもつことを期待します。

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

SubproblemAlgorithm

反復ステップの計算方法を定義します。'cg' は密なヘッシアンをもつ大規模な問題より高速に解ける可能性がありますが、既定の 'factorization' は一般に 'cg' (共役勾配) より高速になります。詳細については、fmincon の内点法アルゴリズムを参照してください。

optimset の場合、値は 'cg' および 'ldl-factorization' です。詳細については、新旧のオプション名を参照してください。

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

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

フィールド名エントリ

objective

目的関数

x0

x の初期点

Aineq

線形不等式制約の行列

bineq

線形不等式制約のベクトル

Aeq

線形等式制約の行列

beq

線形等式制約のベクトル
lb下限のベクトル
ub上限のベクトル

nonlcon

非線形制約関数

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 法での合計反復回数 ('trust-region-reflective''interior-point' アルゴリズム)

stepsize

x の最終変位

constrviolation

制約関数の最大値 ('interior-point' アルゴリズム)

bestfeasible

検出された最適 (最小目的関数) 実行可能点 ('interior-point' アルゴリズム)。次のフィールドで構成される構造体:

  • x

  • fval

  • firstorderopt

  • constrviolation

実行可能点が見つからなかった場合は、bestfeasible フィールドが空になります。そのため、制約関数の最大値が options.ConstraintTolerance を超えなければ、点は実行可能になります。

bestfeasible の点は、さまざまな理由で、返された解の点 x とは異なる可能性があります。例については、最良実行可能点の取得を参照してください。

algorithm

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

message

終了メッセージ

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

lower

lb に対応する下限

upper

ub に対応する上限

ineqlin

A および b に対応する線形不等式

eqlin

Aeq および beq に対応する線形等式

ineqnonlin

nonlconc に対応する非線形不等式

eqnonlin

nonlconceq に対応する非線形等式

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

解にアクティブな制約条件がある問題では、jacobian は信頼区間の推定には有用ではありません。

制限

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

  • lsqnonlin は複素数値問題を直接解くことができます。制約は複素数値に対して意味を持たないことに注意してください。なぜなら、複素数はきちんと順序付けされておらず、ある複素数値が他の複素数値より大きいか小さいかを問うことは無意味だからです。範囲制約を使用した複素数問題では、変数を実数部と虚数部に分けます。複素数データに 'interior-point' アルゴリズムを使用しないでください。詳細については、複素数値データへのモデルの当てはめを参照してください。

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

'interior-point' アルゴリズムは fmincon 'interior-point' アルゴリズムにいくつかの変更を加えて使用します。詳細については、制約付き最小二乗法に合わせて変更された fmincon アルゴリズムを参照してください。

代替機能

アプリ

[最適化] ライブ エディター タスクが 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 より前に導入

すべて展開する