fsolve
R2026b連立非線形方程式を解く
構文
説明
は、点 x = fsolve(fun,x0)x0 を開始点として、方程式 fun(x) = "0" (ゼロの配列) の解を求めようとします。
メモ
追加パラメーターの受け渡し は必要に応じて他のパラメーターを関数 fun(x) へ渡す方法を説明します。パラメーター付き方程式の求解を参照してください。
は x = fsolve(fun,x0,options)options で指定された最適化オプションを使用して方程式を解きます。optimoptions を使用してこれらのオプションを設定してください。
例
この例では、2 変数の 2 つの非線形方程式を解く方法を説明します。方程式は次のとおりです。
これらの方程式を の形式に変換します。
この例を実行する際に使用できる関数 root2d.m は、値を計算します。
type root2d.mfunction 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. <stopping criteria details>
x = 1×2
0.3532 0.6061
非線形システムの解法プロセスを検証します。
表示を返さず、1 次の最適性を表示するプロット関数をもつようにオプションを設定します。この場合、アルゴリズムが反復すると 0 に収束します。
options = optimoptions("fsolve",... Display="none",PlotFcn=@optimplotfirstorderopt);
非線形システムの方程式は次のとおりです。
これらの方程式を の形式に変換します。
関数 root2d は、これらの 2 つの方程式の左辺値を計算します。
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; end
[0,0] を開始点とする非線形システムを解き、解法プロセスを確認します。
fun = @root2d; x0 = [0,0]; x = fsolve(fun,x0,options)

x = 1×2
0.3532 0.6061
追加パラメーターの受け渡しのトピックで説明されているように、方程式はパラメーター化することができます。たとえば、この例の最後に記載されている補助関数 paramfun は、 によってパラメーター化され、次の方程式を生成します。
特定の値の方程式を解くには (この場合は )、ワークスペースに を設定して、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. <stopping criteria details>
x = 1×2
0.1976 0.4255
の別の値について解く場合は、新しい 値をもつように、ワークスペースに を入力して関数 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. <stopping criteria details>
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);
非線形システムの方程式は次のとおりです。
これらの方程式を の形式に変換します。
関数 root2d は、これらの 2 つの方程式の左辺値を計算します。
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; end
問題構造体の残りのフィールドを作成します。
problem.objective = @root2d;
problem.x0 = [0,0];
problem.solver = "fsolve";問題を解きます。
x = fsolve(problem)

x = 1×2
0.3532 0.6061
この例では、2 つの未知数をもつ 2 つの方程式から成る連立方程式の解法プロセスを示す反復表示が返されます。
これらの方程式を、 の形式に書き直します。
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.
<stopping criteria details>
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 の許容誤差内で) になります。
次を満たす行列 を求めます。
,
点 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.↵↵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.↵↵<stopping criteria details>↵↵Equation solved. The sum of squared function values, r = 1.336702e-19, is less than↵sqrt(options.FunctionTolerance) = 1.000000e-03. The relative norm of the gradient of r,↵4.019681e-10, is less than options.OptimalityTolerance = 1.000000e-06.'
終了フラグ値 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 列の配列として x を fun に渡します。
ヤコビアンも計算することができ、さらに下式で設定された SpecifyObjectiveGradient オプションが true である場合を考えます。
options = optimoptions("fsolve",SpecifyObjectiveGradient=true)関数 fun は 2 番目の出力引数に x でのヤコビ値 J 行列を返さなければなりません。
fun が m 個の要素をもつベクトル (行列) を返し、x が長さ n をもつ場合 (ここで、n は x0 の長さ)、ヤコビアン J は m 行 n 列の行列になります。ここで、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 |
いくつかのアルゴリズム オプションを設定するために、
|
| Diagnostics | 最小化または計算する関数に関する情報を表示します。選択肢は |
| DiffMaxChange | 有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は |
| DiffMinChange | 有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は |
Display | 表示レベル (反復表示を参照):
|
FiniteDifferenceStepSize | 有限差分のスカラーまたはベクトルのステップ サイズ ファクター。
sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分は次のようになります。
FiniteDifferenceStepSize はベクトルに展開されます。既定値は、前進有限差分法では sqrt(eps)、中心有限差分法では eps^(1/3) です。
|
FiniteDifferenceType | 勾配推定に使用される有限差分は アルゴリズムは有限差分の両方のタイプを推定するとき、範囲に注意深く従います。そのためたとえば、forward ではなく、backward を選択すると、範囲外の点を計算しないようにすることができます。
|
FunctionTolerance | 関数値に関する終了許容誤差 (非負のスカラー)。既定値は
|
| FunValCheck | 目的関数値が有効かどうかをチェックします。 |
MaxFunctionEvaluations | 関数評価の最大許容回数 (非負の整数)。既定の値は、
|
MaxIterations | 反復の最大許容回数 (非負の整数)。既定値は
|
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は 内部的に、 |
OutputFcn | 各反復で最適化関数が呼び出すユーザー定義の関数を 1 つ以上指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ( |
PlotFcn | アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。組み込みプロット関数名、関数ハンドル、または組み込みプロット関数名か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし (
カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細については、Optimization Toolbox の出力関数および出力関数とプロット関数の構文を参照してください。
|
SpecifyObjectiveGradient |
|
StepTolerance |
|
TypicalX | 典型的な
|
UseParallel | 勾配の推定に並列計算を使用するためのオプション。次の値のいずれかとして指定します。
下位互換性のため、値 MATLAB で並列プールを使用して計算を実行するには、Parallel Computing Toolbox™ が必要です。 詳細については、並列計算を参照してください。 |
| 信頼領域法アルゴリズム | |
JacobianMultiplyFcn | ヤコビ乗算関数。関数ハンドルとして指定されます。大規模構造化問題に対して、この関数は実際に W = jmfun(Jinfo,Y,flag) ここで、 [F,Jinfo] = fun(x)
いずれの場合でも メモ
同様の例は 密に構造化されたヘッシアンと線形等式を使用した最小化 を参照してください。
|
| JacobPattern | 有限差分に対するヤコビ スパース パターン。
最悪の場合、構造が不明であれば、 |
| MaxPCGIter | PCG (前処理付き共役勾配) 法の反復の最大回数です (正のスカラー)。既定値は |
| PrecondBandWidth | PCG に対する前提条件子の帯域幅の上限 (非負の整数)。既定の |
SubproblemAlgorithm | 反復ステップの計算方法を定義します。既定の設定である |
| TolPCG | PCG 反復に関する終了許容誤差 (正のスカラー)。既定値は |
| レーベンバーグ・マルカート法アルゴリズム | |
| InitDamping | レーベンバーグ・マルカート パラメーターの初期値 (正のスカラー)。既定値は |
| ScaleProblem |
|
UseCodegenSolver | ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。 |
例: options = optimoptions("fsolve",FiniteDifferenceType="central")
次のフィールドをもつ構造体として指定される問題構造体です。
| フィールド名 | エントリ |
|---|---|
| 目的関数 |
| x の初期点 |
| "fsolve" |
| optimoptions で作成されたオプション |
データ型: struct
出力引数
実数ベクトルまたは実数配列として返される解です。x のサイズは、x0 のサイズと同じです。通常、exitflag が正の場合、x は問題に対する局所的な解になります。解の質の詳細については、ソルバーが成功する場合を参照してください。
解での目的関数値。実数ベクトルとして返されます。一般的に、fval = fun(x) になります。
fsolve の停止理由。整数として返されます。
| 方程式が解けました。1 次の最適性は僅かです。 |
| 方程式が解けました。指定された許容誤差を |
| 方程式が解けました。残差の変化が指定した許容誤差を下回っています。 |
| 方程式が解けました。探索方向の大きさが指定した許容誤差を下回っています。 |
| 反復回数が |
| 出力関数またはプロット関数によってアルゴリズムが停止しました。 |
| 方程式が解けませんでした。終了メッセージで詳細を確認できる場合があります。 |
| 方程式が解けませんでした。信頼領域の半径が小さくなりすぎています ( |
最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。
iterations | 実行した反復回数 |
funcCount | 関数評価の回数 |
algorithm | 使用される最適化アルゴリズム |
cgiterations | PCG 法の合計反復回数 ( |
stepsize |
|
firstorderopt | 1 次の最適性の尺度 |
message | 終了メッセージ |
解におけるヤコビアン。実数行列として返されます。jacobian(i,j) は、解 x での x(j) に関する fun(i) の偏導関数です。
解にアクティブな制約条件がある問題では、jacobian は信頼区間の推定には有用ではありません。
制限
解かれる関数は連続でなければなりません。
うまく実行できた場合、
fsolveは 1 つの根のみを出力します。既定の Trust-region-dogleg 法は連立方程式が合致する、すなわち、方程式の数が未知数の数と等しい場合にのみ使用できます。レーベンバーグ・マルカート法では、連立方程式が合致している必要はありません。
詳細
次のいくつかの項目は、fsolve から表示される可能性がある、より詳細な終了メッセージをリストしたものです。より詳細な終了メッセージでは、詳細な情報のリンクがメッセージの最初の文として提供されます。
ソルバーによって、関数値の二乗和が許容誤差 FunctionToleranceの平方根より小さな点が見つかりました。二乗和の勾配も、OptimalityTolerance (レーベンバーグ・マルカート法のアルゴリズムの場合は、1e-4*OptimalityTolerance) より小さくなっています。
作業の進め方については、ソルバーが成功する場合を参照してください。
初期点は、関数値の二乗和がFunctionTolerance 許容誤差の平方根より小さいため、方程式の解と思われます。二乗和の勾配のサイズも、OptimalityTolerance (レーベンバーグ・マルカート法のアルゴリズムの場合は、1e-4*OptimalityTolerance) より小さくなっています。
作業の進め方については、最終点が初期点と等しいを参照してください。
ソルバーによって、関数値の二乗和が許容誤差 FunctionToleranceの平方根より小さな点が見つかりました。ただし、最後のステップがStepTolerance許容誤差より小さく、関数が急激に変化しているか、最終点近傍で滑らかでないことを示していました。このため "停止" しました。
作業の進め方については、局所的最小値の可能性を参照してください。
ソルバーによって、関数値の二乗和が許容誤差 FunctionToleranceの平方根より小さな点が見つかりました。ただし、二乗和の勾配が OptimalityTolerance (レーベンバーグ・マルカート法のアルゴリズムの場合は、1e-4*OptimalityTolerance) より大きくなっても、最後のステップでの二乗和の変化はほとんどありませんでした。これは、報告された点が解に近くないことを示している可能性があります。
作業の進め方については、局所的最小値の可能性を参照してください。
ソルバーでは、関数値の二乗和がこれ以上減少しませんが、この和は許容誤差 FunctionToleranceの平方根を超えています。
作業の進め方については、fsolve が方程式を解けないを参照してください。
次のいくつかの項目は、fsolve の終了メッセージに含まれる用語の定義を示したものです。
連立方程式 F(x) = 0 を解くために、ソルバーは通常、関数値の二乗和 r = Σ(Fi(x))2 を最小化しようと試みます。解では r と ∇r のどちらもゼロになります。
許容誤差は、一般的に、それを超えた場合にソルバーの反復を停止するしきい値です。許容誤差の詳細については、許容誤差と停止条件を参照してください。
OptimalityTolerance と呼ばれる許容誤差は 1 次の最適性の尺度に対応します。反復計算は、1 次の最適性の尺度が OptimalityTolerance 未満の場合に終了します。
1 次の最適性の尺度は、関数値の二乗和の勾配のサイズです。これは滑らかな関数の根ではゼロになります。
FunctionTolerance と呼ばれる、関数の許容誤差は、関数値の二乗和の直近の変化のサイズに対応します。
StepTolerance は、最後のステップのサイズの許容誤差、つまり、fsolveが評価された位置での変化のサイズを表します。
問題が均一になっています。つまり、関数値の二乗和の勾配のサイズが、OptimalityTolerance 許容誤差 (レーベンバーグ・マルカート法のアルゴリズムの場合は、1e-4*OptimalityTolerance) より小さくなっています。
ソルバーでは、関数値の二乗和を許容誤差 FunctionToleranceの平方根未満にできませんでした。最後の反復で、これ以上の試行を保証するほど、二乗和が十分に減少しませんでした。
作業の進め方については、fsolve が方程式を解けないを参照してください。
信頼領域が小さすぎて続行できません。これは、関数値の二乗和が二次モデルに近くないためである可能性があります。詳細については、Trust-region-dogleg 法アルゴリズムを参照してください。
信頼領域が小さすぎて続行できません。これは、関数値の二乗和が二次モデルに近くないためである可能性があります。詳細については、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.
拡張機能
fsolveは、関数codegen(MATLAB Coder) または MATLAB Coder™ アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。ターゲット ハードウェアは、標準的な倍精度浮動小数点計算をサポートしていなければなりません。単精度計算や固定小数点計算のコードは生成できません。
コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。
コードを生成する前に MATLAB でコードをテストするには、
UseCodegenSolverオプションをtrueに設定します。これにより、ソルバーがコード生成で作成されるものと同じコードを使用するようになります。生成用のコードはすべて、MATLAB コードでなければなりません。特に、カスタム ブラックボックス関数を
fsolveの目的関数として使用することはできません。coder.cevalを使用して、C または C++ でコード化されたカスタム関数を評価することはできます。ただし、そのカスタム関数は MATLAB 関数内で呼び出さなければなりません。コード生成では、複素数値データはサポートされていません。
コード生成の場合、
fsolveはproblem引数をサポートしていません。[x,fval] = fsolve(problem) % Not supported目的関数は、string や文字の名前ではなく、関数ハンドルを使用して指定しなければなりません。
x = fsolve(@fun,x0,options) % Supported % Not supported: fsolve('fun',...) or fsolve("fun",...)
組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。
fsolveのオプションを含め、関数optimoptionsを使用して指定しなければなりません。オプションにはAlgorithmオプションを含め、"levenberg-marquardt"に設定しなければなりません。options = optimoptions("fsolve",Algorithm="levenberg-marquardt"); [x,fval,exitflag] = fsolve(fun,x0,options);
コード生成では次のオプションをサポートしています。
Algorithm—"levenberg-marquardt"でなければなりません。FiniteDifferenceStepSizeFiniteDifferenceTypeFunctionToleranceMaxFunctionEvaluationsMaxIterationsSpecifyObjectiveGradientStepToleranceTypicalXUseCodegenSolver
生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、ドット表記ではなく、
optimoptionsを使用することを推奨します。opts = optimoptions("fsolve",Algorithm="levenberg-marquardt"); opts = optimoptions(opts,MaxIterations=1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
オプションはファイルから読み込まないでください。そうした場合、コード生成に失敗することがあります。代わりに、コード内でオプションを作成してください。
通常、サポートされていないオプションを指定すると、コード生成の際にそのオプションは暗黙的に無視されます。ただし、ドット表記を使用してプロット関数や出力関数を指定すると、コード生成でエラーが発生することがあります。信頼性を確保するために、サポートされているオプションのみを指定してください。
出力関数とプロット関数はサポートされていないため、ソルバーは終了フラグ –1 を返しません。
例については、fsolve のコード生成を参照してください。
並列実行するには、UseParallel オプションを "auto" または "on" に設定します。
options = optimoptions("solvername",UseParallel="auto")
詳細については、並列計算のテストを参照してください。
バージョン履歴
R2006a より前に導入名前と値の引数 UseParallel で、true または false の代わりに、"off"、"auto"、または "on" の値が受け入れられます。この変更により、並列実行に並列プールを使用する状況をより細かく制御できます。
名前と値の引数 UseParallel を true または false として指定することは推奨されません。
実行するタスクに応じたコードの更新方法を次の表に示します。
| タスク | 推奨 | 非推奨 |
|---|---|---|
MATLAB クライアントで実行されるコードを記述する。 | optimoptions("fsolve",UseParallel="off") | optimoptions("fsolve",UseParallel=false) |
| 並列プールで実行され、プールが使用できない場合は MATLAB クライアントで実行される移植可能なコードを記述する。 | optimoptions("fsolve",UseParallel="auto") | optimoptions("fsolve",UseParallel=true) |
| 並列プールで実行され、プールが使用できない場合はエラーを発行するコードを記述する。 | optimoptions("fsolve",UseParallel="on") | 該当なし |
値 true と false のサポートを削除する予定はありません。
新しい UseCodegenSolver オプションを true に設定すると、fsolve は、コード生成で作成されるものと同じバージョンのソフトウェアを使用します。このオプションを使用すると、コードを生成する前またはコードをハードウェアに展開する前に、ソルバーの動作を確認できます。コード生成時にこのオプションを含めることができます。このオプションはコード生成には影響しませんが、オプションを含めたままにしておくと、削除する手間が省けます。生成されるコードは MATLAB コードと同じですが、リンクされている数学ライブラリが異なる可能性があるため、結果は若干異なる場合があります。
CheckGradients オプションは削除されました。勾配がコードで正しく計算されるかどうかをチェックするには、checkGradients 関数を使用します。以下に例を示します。
function [f,g] = rosen(x) f = 100*(x(1) - x(2)^2)^2 + (1 - x(2))^2; if nargout > 1 g(1) = 200*(x(1) - x(2)^2); g(2) = -400*x(2)*(x(1) - x(2)^2) - 2*(1 - x(2)); end end % Before using the rosen function, % you can check that the gradient is correct at a point x0 = [2,4]; assert(checkGradients(@rosen,x0))
JacobianMultiplyFcn オプションの構文は次のとおりです。
W = jmfun(Jinfo, Y, flag)
MATLAB が関数 jmfun に渡す Jinfo データに、任意のデータ型を使用できるようになりました。たとえば、Jinfo を構造体にすることが可能になりました。以前のリリースでは、Jinfo は標準の double 配列にする必要がありました。
Jinfo データは目的関数の 2 番目の出力です。
[F,Jinfo] = myfun(x)
CheckGradients オプションは将来のリリースで削除される予定です。目的関数または非線形制約関数の 1 次導関数を確認するには、関数 checkGradients を使用します。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)