Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2023.1.0 - 日本語


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.
3tolが小さすぎます. 近似解 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の呼び出し手順は以下のようにします

fct(int *n, double x[],double v[],int *iflag)

インクリメンタルリンクが可能です (ヘルプ 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 が収束したかどうかを確認するために, 終了インジケータと残差を確認するようにしてください.

参照

  • external — Scilabオブジェクト, 外部関数またはルーチン
  • qpsolve — 線形二次計画ソルバー
  • optim — non-linear optimization routine
pw
Report an issue
<< Simplex Optimization and Simulation karmarkar >>

Copyright (c) 2022-2023 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon May 22 12:43:10 CEST 2023