Main Content

fsolve

非線形方程式系を解く

説明

非線形システム ソルバー

以下で指定される問題を解きます。

F(x) = 0

x に対し、F(x) はベクトル値を返す関数です。

x はベクトルまたは行列です。行列引数を参照してください。

x = fsolve(fun,x0) は、点 x0 を開始点として、方程式 fun(x) = "0" (ゼロの配列) の解を求めようとします。

メモ

追加パラメーターの受け渡し は必要に応じて他のパラメーターを関数 fun(x) へ渡す方法を説明します。詳細については、パラメーター付き方程式の求解を参照してください。

x = fsolve(fun,x0,options)options で指定された最適化オプションを使用して方程式を解きます。optimoptions を使用してこれらのオプションを設定してください。

x = fsolve(problem) は、problemで説明されている構造体 problem を解きます。

[x,fval] = fsolve(___) は、どの構文でも、解 x での目的関数 fun の値を返します。

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

[x,fval,exitflag,output,jacobian] = fsolve(___) は、解 x における fun のヤコビアンを返します。

すべて折りたたむ

この例では、2 変数の 2 つの非線形方程式を解く方法を説明します。方程式は次のとおりです。

e-e-(x1+x2)=x2(1+x12)x1cos(x2)+x2sin(x1)=12.

これらの方程式を F(x)=0 の形式に変換します。

e-e-(x1+x2)-x2(1+x12)=0x1cos(x2)+x2sin(x1)-12=0.

この例を実行する際に使用できる関数 root2d.m は、値を計算します。

type root2d.m
function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

[0,0] を開始点として方程式系を解きます。

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.3532    0.6061

非線形システムの解法プロセスを検証します。

表示を返さず、1 次の最適性を表示するプロット関数をもつようにオプションを設定します。この場合、アルゴリズムが反復すると 0 に収束します。

options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);

非線形システムの方程式は次のとおりです。

e-e-(x1+x2)=x2(1+x12)x1cos(x2)+x2sin(x1)=12.

これらの方程式を F(x)=0 の形式に変換します。

e-e-(x1+x2)-x2(1+x12)=0x1cos(x2)+x2sin(x1)-12=0.

関数 root2d は、これらの 2 つの方程式の左辺値を計算します。

type root2d.m
function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

[0,0] を開始点とする非線形システムを解き、解法プロセスを確認します。

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0,options)

x = 1×2

    0.3532    0.6061

追加パラメーターの受け渡しのトピックで説明されているように、方程式はパラメーター化することができます。たとえば、この例の最後に記載されている補助関数 paramfun は、c によってパラメーター化され、次の方程式系を生成します。

2x1+x2=exp(cx1)-x1+2x2=exp(cx2).

特定の値の系を解くには (この場合は c=-1)、ワークスペースに c を設定して、paramfun から無名関数 x を生成します。

c = -1;
fun = @(x)paramfun(x,c);

x0 = [0 1] から始めて系を解きます。

x0 = [0 1];
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.1976    0.4255

c の別の値について解く場合は、新しい c 値をもつように、ワークスペースに c を入力して関数 fun を再度生成します。

c = -2;
fun = @(x)paramfun(x,c); % fun now has the new c value
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.1788    0.3418

補助関数

次のコードは、補助関数 paramfun を作成します。

function F = paramfun(x,c)
F = [ 2*x(1) + x(2) - exp(c*x(1))
      -x(1) + 2*x(2) - exp(c*x(2))];
end

fsolve の問題構造体を作成し、問題を解きます。

既定ではないオプションによる解と同じ問題を解きます。ただし、問題構造体を使用して問題を定式化します。

表示を返さず、1 次の最適性を表示するプロット関数をもつように問題のオプションを設定します。この場合、アルゴリズムが反復すると 0 に収束します。

problem.options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);

非線形システムの方程式は次のとおりです。

e-e-(x1+x2)=x2(1+x12)x1cos(x2)+x2sin(x1)=12.

これらの方程式を F(x)=0 の形式に変換します。

e-e-(x1+x2)-x2(1+x12)=0x1cos(x2)+x2sin(x1)-12=0.

関数 root2d は、これらの 2 つの方程式の左辺値を計算します。

type root2d
function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

問題構造体の残りのフィールドを作成します。

problem.objective = @root2d;
problem.x0 = [0,0];
problem.solver = 'fsolve';

問題を解きます。

x = fsolve(problem)

x = 1×2

    0.3532    0.6061

この例では、2 つの未知数をもつ 2 つの方程式から成る方程式系の解法プロセスを示す反復表示が返されます。

2x1-x2=e-x1-x1+2x2=e-x2.

これらの方程式を、F(x) = 0 の形式に書き直します。

2x1-x2-e-x1=0-x1+2x2-e-x2=0.

x0 = [-5 -5] での解の検索を開始します。

まず、x での方程式の値 F を計算する関数を記述します。

F = @(x) [2*x(1) - x(2) - exp(-x(1));
         -x(1) + 2*x(2) - exp(-x(2))];

初期点 x0 を作成します。

x0 = [-5;-5];

反復表示を返すようにオプションを設定します。

options = optimoptions('fsolve','Display','iter');

方程式を解きます。

[x,fval] = fsolve(F,x0,options)
                                             Norm of      First-order   Trust-region
 Iteration  Func-count     ||f(x)||^2           step       optimality         radius
     0          3             47071.2                        2.29e+04              1
     1          6             12003.4              1         5.75e+03              1
     2          9             3147.02              1         1.47e+03              1
     3         12             854.452              1              388              1
     4         15             239.527              1              107              1
     5         18             67.0412              1             30.8              1
     6         21             16.7042              1             9.05              1
     7         24             2.42788              1             2.26              1
     8         27            0.032658       0.759511            0.206            2.5
     9         30         7.03149e-06       0.111927          0.00294            2.5
    10         33         3.29525e-13     0.00169132         6.36e-07            2.5

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 2×1

    0.5671
    0.5671

fval = 2×1
10-6 ×

   -0.4059
   -0.4059

反復表示は f(x) を示します。これは、関数 F(x) のノルムの 2 乗です。この値は、反復が行われるたびに減少してゼロに近づきます。1 次の最適性の尺度も同様に、反復が行われるたびに減少してゼロに近づきます。これらのエントリは、反復が解に向かって収束していることを示しています。他のエントリの意味については、反復表示を参照してください。

fval 出力は、関数値 F(x) を与えます。この値は、解においてゼロ (FunctionTolerance の許容誤差内で) になります。

次を満たす行列 X を求めます。

X*X*X=[1234],

これは、点 x0 = [1,1;1,1] を開始点とします。行列方程式を計算する無名関数を作成し、点 x0 を作成します。

fun = @(x)x*x*x - [1,2;3,4];
x0 = ones(2);

オプションを設定して表示しないようにします。

options = optimoptions('fsolve','Display','off');

fsolve の出力を検証して、解の質および解法プロセスを確認します。

[x,fval,exitflag,output] = fsolve(fun,x0,options)
x = 2×2

   -0.1291    0.8602
    1.2903    1.1612

fval = 2×2
10-9 ×

   -0.2742    0.1258
    0.1876   -0.0864

exitflag = 1
output = struct with fields:
       iterations: 11
        funcCount: 52
        algorithm: 'trust-region-dogleg'
    firstorderopt: 4.0197e-10
          message: 'Equation solved....'

終了フラグ値 1 は、解が信頼できることを示します。これを手動で検証するには、残差 (fval の二乗和) を計算して、どの程度ゼロに近いかを確認します。

sum(sum(fval.*fval))
ans = 1.3367e-19

このように残差が小さい場合、x が解であることが確認できます。

output 構造体で、解を求めるために fsolve が実行する反復および関数評価の回数を確認できます。

入力引数

すべて折りたたむ

解を求める非線形方程式。関数ハンドルまたは関数名として指定されます。fun は、ベクトル x を受け、x で評価される非線形方程式である、ベクトル F を返す関数です。解を求める方程式は、F のすべての成分について、F = 0 になります。関数 fun はファイルの関数ハンドルとして指定することができます。

x = fsolve(@myfun,x0)

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

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

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

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

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

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

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

関数 fun は 2 番目の出力引数に x でのヤコビ値 J 行列を返さなければなりません。

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

例: fun = @(x)x*x*x-[1,2;3,4]

データ型: char | function_handle | string

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

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

データ型: double

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

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

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

すべてのアルゴリズム
Algorithm

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

Algorithm オプションは使用するアルゴリズムの優先順位を指定します。これは基本設定のみです。信頼領域法アルゴリズムでは、非線形方程式系は劣決定では解けません。すなわち、方程式の数 (fun によって返される F の要素数) は少なくとも x の長さと同じでなければなりません。同様に、Trust-region-dogleg 法アルゴリズムの場合は、方程式の数は x の長さと同じでなければなりません。選択したアルゴリズムを使用できない場合は、fsolve はレーベンバーグ・マルカート アルゴリズムを使用します。アルゴリズムの選択の詳細については、アルゴリズムの選択を参照してください。

いくつかのアルゴリズム オプションを設定するために、optimoptions の代わりに optimset を使用します。

  • Algorithm — アルゴリズムを 'trust-region' の代わりに 'trust-region-reflective' に設定します。

  • InitDampingAlgorithm{'levenberg-marquardt',.005} などの cell 配列に設定し、レーベンバーグ・マルカート法の初期パラメーター λ を設定します。

CheckGradients

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

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

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

Diagnostics

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

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-dogleg' および 'trust-region' アルゴリズムでは 100*numberOfVariables'levenberg-marquardt' アルゴリズムでは 200*numberOfVariables です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

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

MaxIterations

反復の最大許容回数 (非負の整数)。既定値は 400 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

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

OptimalityTolerance

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

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

OutputFcn

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

PlotFcn

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

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

  • 'optimplotfunccount' は関数カウントをプロットします。

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

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

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

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

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

SpecifyObjectiveGradient

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

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

StepTolerance

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

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

TypicalX

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

trust-region-dogleg アルゴリズムは TypicalX をスケーリング行列の対角項として使用します。

UseParallel

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

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

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

W = jmfun(Jinfo,Y,flag)

ここで、JinfoJ*Y (または J'*YJ'*(J*Y)) の計算に使用されるデータを含んでいます。最初の引数 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 は陽的に計算されません。fsolveJinfo を使用して前提条件子を計算します。jmfun が必要とする追加のパラメーターを与える方法については 追加パラメーターの受け渡し を参照してください。

メモ:

'SpecifyObjectiveGradient' は、fsolveJinfofun から jmfun に渡すために true に設定しなければなりません。

同様の例は 密に構造化されたヘッシアンと線形等式を使用した最小化 を参照してください。

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

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

MaxPCGIter

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

PrecondBandWidth

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

SubproblemAlgorithm

反復ステップの計算方法を定義します。既定の設定である 'factorization' のステップは 'cg' より低速ですが、精度の点で勝ります。詳細については、信頼領域法アルゴリズムを参照してください。

TolPCG

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

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

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

ScaleProblem

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

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

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

フィールド名エントリ

objective

目的関数

x0

x の初期点

solver

'fsolve'

options

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

データ型: struct

出力引数

すべて折りたたむ

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

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

fsolve の停止理由。整数として返されます。

1

方程式が解けました。1 次の最適性は僅かです。

2

方程式が解けました。指定された許容誤差を x の変化が下回っているか、x におけるヤコビアンが未定義です。

3

方程式が解けました。残差の変化が指定した許容誤差を下回っています。

4

方程式が解けました。探索方向の大きさが指定した許容誤差を下回っています。

0

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

-1

出力関数またはプロット関数によってアルゴリズムが停止しました。

-2

方程式が解けませんでした。終了メッセージで詳細を確認できる場合があります。

-3

方程式が解けませんでした。信頼領域の半径が小さくなりすぎています (trust-region-dogleg アルゴリズム)。

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

iterations

実行した反復回数

funcCount

関数評価の回数

algorithm

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

cgiterations

PCG 法の合計反復回数 ('trust-region' アルゴリズムのみ)

stepsize

x の最終変位 ('trust-region-dogleg' 以外)

firstorderopt

1 次の最適性の尺度

message

終了メッセージ

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

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

制限

  • 解かれる関数は連続でなければなりません。

  • うまく実行できた場合、fsolve は 1 つの根のみを出力します。

  • 既定の Trust-region-dogleg 法は方程式系が合致する、すなわち、方程式の数が未知数の数と等しい場合にのみ使用できます。レーベンバーグ・マルカート法では、方程式系が合致している必要はありません。

ヒント

  • 大規模な問題、つまり数千を超える変数が含まれる問題の場合、Algorithm オプションを 'trust-region'SubproblemAlgorithm オプションを 'cg' に設定することにより、メモリを節約できます (場合によっては時間を短縮できます)。

アルゴリズム

レーベンバーグ・マルカート法および信頼領域法は、lsqnonlin にも使用される非線形最小二乗アルゴリズムに基づいています。システムが 0 をもたない可能性がある場合、これらの方法の 1 つを使用してください。アルゴリズムは、残差が小さいところの点を戻します。しかし、システムのヤコビアンが特異な場合、アルゴリズムが方程式系の解ではない点に収束する可能性があります (制限 を参照)。

  • 既定の設定では fsolve は Trust-region-dogleg 法アルゴリズムを選択します。アルゴリズムは [8] で説明される Powell dogleg method を変形したものです。これは [7] で実装したアルゴリズムと似た性質をもちます。詳細については、Trust-region-dogleg 法アルゴリズムを参照してください。

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

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

代替機能

アプリ

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

参照

[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.

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

[5] Marquardt, D., “An Algorithm for Least-squares Estimation of Nonlinear Parameters,” SIAM Journal Applied Mathematics, 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.

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

すべて展開する