ドキュメンテーション

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

lsqnonlin

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

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

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

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

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

構文

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] = lsqnonlin(...)
[x,resnorm,residual,exitflag] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(...)

説明

lsqnonlin は非線形データ近似問題を含む非線形最小二乗問題を解きます。

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

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

その後、ベクトル項を使ってこの最適化問題を次のように書き換えることができます。

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

ここで x はベクトルまたは行列、f(x) はベクトル値または行列値を返す関数です。行列値についての詳細は、行列引数を参照してください。

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

x = lsqnonlin(fun,x0,lb,ub) は、解が常に lb  x  ub の範囲に存在するように、設計変数 x に上限と下限を定義します。

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] = lsqnonlin(...) は、解 x における残差 fun(x) の値を返します。

[x,resnorm,residual,exitflag] = lsqnonlin(...) は、終了条件を記述する値 exitflag を返します。

[x,resnorm,residual,exitflag,output] = lsqnonlin(...) は最適化の情報を含む構造体 output を返します。

[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(...) は、解 x におけるラグランジュ乗数をフィールドに含む、構造体 lambda を返します。

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(...) は、解 x における fun のヤコビ行列を返します。

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

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

入力引数

lsqnonlin に渡す引数の一般的な説明は 関数の引数 にあります。この節では、funoptionsproblem の各関数に固有な詳細を示します。

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);

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

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

ヤコビ行列を計算することができ、さらに以下のように Jacobian オプションが '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 の勾配の転置であることに注意してください)。

options

オプションoptions の値の関数固有の詳細を示します。

problem

objective

目的関数

x0

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

solver

'lsqnonlin'

options

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

出力引数

lsqnonlin が返す引数の一般的な説明は 関数の引数 にあります。この節では、exitflaglambdaoutput の各関数に固有な詳細を示します。

exitflag

アルゴリズムが停止した理由を示す整数。以下の表は exitflag の値とそれに対応したアルゴリズムが終了した理由を示します。

1

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

2

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

3

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

4

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

0

反復回数が options.MaxIter を超えた、または関数評価の回数が options.MaxFunEvals を超えたことを示します。

-1

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

-2

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

-4

ライン探索は、現在の探索方向に沿って、残差が十分減少できません。

lambda

x でのラグランジュ乗数を含む構造体 (制約タイプにより分類) です。フィールドは次のとおりです。

lower

下限 lb

upper

上限 ub

output

最適化に関する情報を含む構造体。構造体のフィールドは以下のようになります。

firstorderopt

1 次の最適性の尺度

iterations

実行した反復回数

funcCount

関数評価回数です。

cgiterations

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

stepsize

x の最終ステップ サイズ (レーベンバーグ・マルカート アルゴリズム)

algorithm

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

message

終了メッセージ

オプション

最適化オプション。関数 optimoptions を使用して、オプションを設定または変更します。いくつかのオプションはすべてのアルゴリズムで使用されますが、信頼領域 Reflective 法アルゴリズムのみレーベンバーグ・マルカート アルゴリズムのみで使用されるオプションもあります。詳細は 最適化オプション リファレンス を参照してください。

アルゴリズム オプション

両方のアルゴリズムは、以下のオプションを使用します。

Algorithm

'trust-region-reflective' (既定の設定) と 'levenberg-marquardt' から選択します。{'levenberg-marquardt',.005} のように Algorithm をセル配列に設定することによって、レーベンバーグ・マルカート法の初期パラメーター λ を設定します。既定値は λ = 0.01 です。

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

DerivativeCheck

ユーザー設定の微分 (目的関数または制約の勾配) と有限差分微分を比較選択肢は 'on' または 'off' (既定の設定) です。

Diagnostics

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

DiffMaxChange

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

DiffMinChange

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

Display

表示レベル:

  • 'off' または 'none' は出力を表示しません。

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

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

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

  • 'final-detailed' は最終出力を表示し、技術的な終了メッセージを返します。

FinDiffRelStep

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

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

中央有限差分は次のとおりです。

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

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

FinDiffType

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

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

FunValCheck

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

Jacobian

'on' の場合、lsqnonlin は目的関数に対してユーザー定義のヤコビ行列 (既定の設定では fun)、または (JacobMult を使用するときの) ヤコビ行列の情報を使用します。'off' (既定の設定) の場合、lsqnonlin は有限差分を使用してヤコビ行列を近似します。

MaxFunEvals

可能な関数評価の最大回数 (正の整数)。既定の設定は 100*numberOfVariables です。

MaxIter

可能な反復の最大数 (正の整数)。既定値 400 です。

OutputFcn

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

PlotFcns

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

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

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

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

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

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

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

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

TolFun

関数値に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。

TolX

x に関する許容誤差 (正のスカラー)。既定の設定は 1e-6 です。

TypicalX

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

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

信頼領域 Reflective 法アルゴリズムは以下のオプションを使用します。

JacobMult

ヤコビ行列乗算関数用の関数ハンドル。大規模構造化問題に対して、この関数は実際に 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 は陽的に計算されません。lsqnonlinJinfo を使用して前提条件子を計算します。jmfun が必要とする追加のパラメーターを与える方法については 追加パラメーターの受け渡し を参照してください。

    メモ:   'Jacobian' は、lsqnonlinJinfofun から jmfun に渡すために 'on' に設定しなければなりません。

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

 
 

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 を提供できる場合、lsqnonlin は、スパース有限差分を使って J を近似することができます。

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

 

MaxPCGIter

PCG (前処理付き共役勾配) 法の反復の最大回数です (正のスカラー)。既定値は max(1, numberOfVariables/2)) です。詳細は、アルゴリズムを参照してください。

 

PrecondBandWidth

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

 

TolPCG

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

 

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

レーベンバーグ・マルカート アルゴリズムは以下のオプションを使用します。

InitDamping

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

ScaleProblem

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

以下を最小にする x を求めます。

k=110(2+2kekx1ekx2)2,

x = [0.3, 0.4] を開始値とします。

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]                        % Starting guess
[x,resnorm] = lsqnonlin(@myfun,x0);   % Invoke optimizer

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

x,resnorm
x = 
     0.2578   0.2578

resnorm = 
     124.3622

診断

メモリとヤコビ行列

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

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

信頼領域 Reflective 法の最適化

信頼領域 Reflective 法は上限と下限を同じ値に設定できません。たとえば、lb(2)==ub(2) の場合、lsqlin はエラーを出力します。

Equal upper and lower bounds not permitted.

(lsqnonlin は等式制約を扱いません。これは別の方法で定式化できます。等式制約がある場合、等式制約を含むことができる別の定式化用の fminconfminimaxfgoalattain を使用してください。)

制限

最小化する関数は連続でなければなりません。そうでなければ、lsqnonlin が局所解のみを出力する可能性があります。

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

信頼領域 Reflective 法の最適化

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

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

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

信頼領域 Reflective 法の問題の収束と必要条件

大規模問題に対して
  • fun にヤコビ行列のスパース構造体を与えるか、ヤコビ行列を計算します。

  • ヤコビ行列はスパースになります。

レーベンバーグ・マルカート法の最適化

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

信頼領域 Reflective 法アルゴリズムは劣決定システムを取り扱わず、Levenberg-Marquardt は範囲制約を取り扱わないため、これらの特性をもつ問題は lsqnonlin で解くことはできません。

詳細

すべて折りたたむ

アルゴリズム

信頼領域 Reflective 法の最適化

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

レーベンバーグ・マルカート法の最適化

optimoptions を使用して Algorithm オプションを 'levenberg-marquardt' に設定すると、lsqnonlin はリーベンバーグ・マルカート法を使用します ([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, pp. 418–445, 1996.

[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, pp. 189-224, 1994.

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

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

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

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

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