ドキュメンテーション

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

fsolve

非線形方程式を解く

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

F(x) = 0

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

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

構文

x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
x = fsolve(problem)
[x,fval] = fsolve(fun,x0)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)

説明

fsolve は非線形方程式の根 (ゼロ) を求めます。

x = fsolve(fun,x0) は、x0 を開始値として fun に記述する方程式の解を求めます。

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

x = fsolve(problem)problem を解きます。ここで、problem は「入力引数」に記述されている構造体です。

作業のエクスポート」で説明されているように、最適化アプリケーションから問題をエクスポートして problem 構造体を作成します。

[x,fval] = fsolve(fun,x0) は、解 x において、目的関数 fun の値を返します。

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

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

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

入力引数

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

fun

解く非線形システムの方程式です。fun はベクトル x を受け付ける関数であり、ベクトル Fx で計算される非線形方程式を返します。関数 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);

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

ヤコビ行列を計算することができ、さらに以下のように Jacobian オプションが 'on' である場合、

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

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

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

problem

objective

目的関数

x0

x の初期点

solver

'fsolve'

options

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

出力引数

fsolve が返す引数の一般的な説明は 関数の引数 にあります。fsolve の出力見出しの情報は 関数特有の見出し を参照してください。

この節では、exitflagoutput の各関数に固有な詳細を示します。

exitflag

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

1

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

2

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

3

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

4

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

0

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

-1

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

-2

アルゴリズムが解でない点に収束したことを示します。

-3

信頼領域の半径が小さくなりすぎたことを示します (trust-region-dogleg アルゴリズム)。

-4

ライン探索は、現在の探索方向に沿って、残差が十分減少できなかったことを示します。

output

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

iterations

実行した反復回数

funcCount

関数評価の回数

algorithm

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

cgiterations

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

stepsize

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

firstorderopt

1 次の最適性の尺度 (dogleg または信頼領域 Reflective 法アルゴリズム、それ以外には [])

message

終了メッセージ

オプション

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

すべてのアルゴリズム

すべてのアルゴリズムが、以下のオプションを使用します。

Algorithm

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

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

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

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) です。fsolve では TypicalX を使用して勾配推定の有限差分をスケーリングします。

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

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

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

JacobMult

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

W = jmfun(Jinfo,Y,flag)

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

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

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

 

MaxPCGIter

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

 

PrecondBandWidth

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

 

TolPCG

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

 

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

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

ScaleProblem

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

例 1

この例は 2 つの未知数をもつ 2 つの連立方程式を解きます。

2x1x2=ex1x1+2x2=ex2.

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

2x1x2ex1=0x1+2x2ex2=0.

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

まず、x での方程式の値 F を計算するファイルを記述します。

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

MATLAB パス上のどこかにこの関数を myfun.m として保存します。次に、初期点とオプションを設定し、fsolve を呼び出します。

x0 = [-5; -5];  % Make a starting guess at the solution
options = optimoptions('fsolve','Display','iter'); % Option to display output
[x,fval] = fsolve(@myfun,x0,options) % Call solver

数回の反復後、fsolve は答えを見つけます。

                                  Norm of  First-order Trust-region
Iteration Func-count    f(x)        step   optimality       radius
    0        3       23535.6                2.29e+004        1
    1        6       6001.72           1    5.75e+003        1
    2        9       1573.51           1    1.47e+003        1
    3       12       427.226           1          388        1
    4       15       119.763           1          107        1
    5       18       33.5206           1         30.8        1
    6       21       8.35208           1         9.05        1
    7       24       1.21394           1         2.26        1
    8       27      0.016329    0.759511        0.206      2.5
    9       30  3.51575e-006    0.111927      0.00294      2.5
   10       33  1.64763e-013  0.00169132    6.36e-007      2.5

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

x =
    0.5671
    0.5671

fval =
  1.0e-006 *
      -0.4059
      -0.4059

例 2

次の方程式を満たす行列 x を求めます。

X*X*X=[1234],

x= [1,1; 1,1] を開始値とします。

まずはじめに解く方程式を計算するファイルを記述します。

function F = myfun(x)
F = x*x*x-[1,2;3,4];

MATLAB パス上のどこかにこの関数を myfun.m として保存します。次に、初期点とオプションを設定し、fsolve を呼び出します。

x0 = ones(2,2);  % Make a starting guess at the solution
options = optimoptions('fsolve','Display','off');  % Turn off display
[x,Fval,exitflag] = fsolve(@myfun,x0,options)

解は以下になります。

x =
    -0.1291    0.8602
     1.2903    1.1612 

Fval =
  1.0e-009 *
   -0.1621    0.0780
    0.1167   -0.0465

exitflag =
     1

そして残差はゼロに近いものになります。

sum(sum(Fval.*Fval))
ans = 
   4.8133e-20

メモ:

連立方程式が線形である場合、速度と精度のために \ (行列の左除算) を使用してください。たとえば、次の線形連立方程式を解く場合を考えてみましょう。

3x1 + 11x2 – 2x3 = 7
x1 + x2 – 2x3 = 4
x1 – x2 + x3 = 19.

以下のように方程式を定式化し、解きます。

A = [ 3 11 -2; 1 1 -2; 1 -1 1];
b = [ 7; 4; 19];
x = A\b
x =
   13.2188
   -2.3438
    3.4375

Diagnostics

すべてのアルゴリズム

fsolve が非ゼロ点に収束する可能性があります。その場合は次のメッセージを表示します。

Optimizer is stuck at a minimum that is not a root
Try again with a new starting guess

この場合、他の開始値を使って fsolve を再実行してください。

Trust-region-dogleg 法のアルゴリズム

Trust-region-dogleg 法の場合、ステップ サイズが小さくなり、それ以上進むことができなくなると fsolve が停止します。fsolve は以下のメッセージを出力します。

The optimization algorithm can make no further progress:
 Trust region radius less than 10*eps

この場合、他の開始値を使って fsolve を再実行してください。

制限

解かれる関数は連続でなければなりません。うまく実行できた場合、fsolve は 1 つの根のみを出力します。fsolve は非ゼロ点に収束する可能性があります。この場合、他の開始値を使って再度試してください。

fsolve は実数変数のみ処理します。x に複素数変数があるときには、これらを実数部と虚数部に分ける必要があります。

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

信頼領域 Reflective 法の前処理付き共役勾配で使用する前提条件は、前提条件を使用する前に JTJ を作成します (ここで J はヤコビ行列です)。そのため多くの非ゼロ要素をもつ J の行は、密行列の積 JTJ に近い結果になり、大きい問題に対してかなりの負荷を要します。

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

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

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

方程式の数

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

詳細

すべて展開する

アルゴリズム

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

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

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

  • レーベンバーグ・マルカート法は [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.

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

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