# 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

    入力パラメータが適切ではありませｎ.

  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
- qpsolve
- optim

pw