Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Français - Português - Русский

Please note that the recommended version of Scilab is 6.0.1. This page might be outdated.
See the recommended documentation of this function

Scilab help >> Optimization and Simulation > fsolve

fsolve

n個の非線形関数システムのゼロを見つける

呼び出し手順

[x [,v [,info]]]=fsolve(x0,fct [,fjac] [,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の呼び出し手順は以下のようにします

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
Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon Oct 01 17:40:32 CEST 2012