n個の非線形関数システムのゼロを見つける
[x, v, info] = fsolve(x0, fct) [x, v, info] = fsolve(x0, fct, fjac) [x, v, info] = fsolve(x0, fct, fjac, tol) [x, v, info] = fsolve(x0, fct, tol)
実数ベクトル (関数引数の初期値).
外部ルーチン (すなわち,関数/リスト/文字列).
外部ルーチン (すなわち,関数/リスト/文字列).
実数スカラー. 許容誤差:
x と解の相対誤差がtol以下となったとアルゴリズムが推定した時点で
終了します.
(tol=1.d-10
がデフォルト値です).
実数ベクトル (関数引数の最終値, 解の推定値).
実数ベクトル (xにおける関数の値).
終了インジケータ
0 | 入力パラメータが適切ではありませn. |
---|---|
1 | アルゴリズムは,xと解の間の相対誤差がtol以下であると指定しています. |
2 | コール回数がfcnに達しましたn. |
3 | tolが小さすぎます. 近似解 x の 改善が不可能です. |
4 | 反復により解が改善されませんでした. |
n個の変数のn個の非線形関数のシステムのゼロを 修正パウエル混合法により求めます. ヤコビアンを指定することができます.
fct
は"外部ルーチン"です.この外部ルーチンは,
指定したx
についてv=fct(x)
を返します.
fct
に関する最も簡単な呼び出し手順は以下のようになります:
fct
が文字列の場合, Scilabにリンクされている
CまたはFortranルーチンを指します.
Fortranの呼び出し手順は以下のようにします
fct(n,x,v,iflag) integer n,iflag double precision x(n),v(n) | ![]() | ![]() |
そしてCの呼び出し手順は以下のようにします
インクリメンタルリンクが可能です (ヘルプ link
).
jac
は外部ルーチン"です.この外部ルーチンは,
指定したx
についてv=d(fct)/dx (x)
を返します.
jac
に関する最も簡単な呼び出し手順は以下のようになります:
jac
が文字列の場合,
Scilabにリンクされている
CまたはFortranルーチンを指します.
この際の呼び出し手順は fctと同じになります.
ただし, v は nxn 配列とする必要があります.
// fsolve に関する簡単な例 a=[1,7;2,8];b=[10;11]; deff('[y]=fsol1(x)','y=a*x+b'); deff('[y]=fsolj1(x)','y=a'); [xres]=fsolve([100;100],fsol1); a*xres+b [xres]=fsolve([100;100],fsol1,fsolj1); a*xres+b // See SCI/modules/optimization/sci_gateway/fortran/Ex-fsolve.f [xres]=fsolve([100;100],'fsol1','fsolj1',1.e-7); a*xres+b | ![]() | ![]() |
初期値や方程式によっては, fsolve の処理は失敗する可能性があります. fsolveで使用される手法はローカル探索法です. このため,使用する方程式で解が得られる確率を大きくするためには, fsolveに良い初期値を与える必要があります.
以下に fsolve が失敗する例を示します:
// fsolve に関する別の例 function F=feuler(x, r) F=x-r-dt*(x.^2-x.^3); endfunction function J=dFdx(x) // Fの微分を定義 J=1-dt*(2*x-3*x^2); endfunction r = 0.04257794928862307 ; dt = 10; [x,v,info]=fsolve(r,list(feuler,r),dFdx); // fsolveは解を見つけることができません disp(v); // 残差 disp(info); // 終了インジケータ [x,v,info]=fsolve(1,list(feuler,r),dFdx); // fsolve は解を見つけます disp(v); // 残差 disp(info); // 終了インジケータ clf();x=linspace(0,1,1000);plot(x,feuler(x)) a=gca();a.grid=[5 5]; | ![]() | ![]() |
このため,fsolveを使用する度に, fsolve が収束したかどうかを確認するために, 終了インジケータと残差を確認するようにしてください.