Please note that the recommended version of Scilab is 2025.0.0. This page might be outdated.
See the recommended documentation of this function
fsolve
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)
パラメータ
- x0
実数ベクトル (関数引数の初期値).
- fct
外部ルーチン (すなわち,関数/リスト/文字列).
- fjac
外部ルーチン (すなわち,関数/リスト/文字列).
- tol
実数スカラー. 許容誤差: x と解の相対誤差がtol以下となったとアルゴリズムが推定した時点で 終了します. (
tol=1.d-10
がデフォルト値です).- x :
実数ベクトル (関数引数の最終値, 解の推定値).
- v :
実数ベクトル (xにおける関数の値).
- info
終了インジケータ
0 入力パラメータが適切ではありませn. 1 アルゴリズムは,xと解の間の相対誤差がtol以下であると指定しています. 2 コール回数がfcnに達しましたn. 3 tolが小さすぎます. 近似解 x の 改善が不可能です. 4 反復により解が改善されませんでした.
説明
n個の変数のn個の非線形関数のシステムのゼロを 修正パウエル混合法により求めます. ヤコビアンを指定することができます.
0 = fct(x) w.r.t x.
fct
は"外部ルーチン"です.この外部ルーチンは,
指定したx
についてv=fct(x)
を返します.
fct
に関する最も簡単な呼び出し手順は以下のようになります:
[v]=fct(x).
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
に関する最も簡単な呼び出し手順は以下のようになります:
[v]=jac(x).
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 が収束したかどうかを確認するために, 終了インジケータと残差を確認するようにしてください.
参照
pwReport an issue | ||
<< Simplex | Optimization and Simulation | karmarkar >> |