Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
5.3.0 - English

Change language to:
Français - 日本語 - Português

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

Scilab manual >> Optimization and Simulation > fsolve

fsolve

find a zero of a system of n nonlinear functions

Calling Sequence

[x [,v [,info]]]=fsolve(x0,fct [,fjac] [,tol])

Arguments

x0

real vector (initial value of function argument).

fct

external (i.e function or list or string).

fjac

external (i.e function or list or string).

tol

real scalar. precision tolerance: termination occurs when the algorithm estimates that the relative error between x and the solution is at most tol. (tol=1.d-10 is the default value).

x :

real vector (final value of function argument, estimated zero).

v :

real vector (value of function at x).

info

termination indicator

0

improper input parameters.

1

algorithm estimates that the relative error between x and the solution is at most tol.

2

number of calls to fcn reached

3

tol is too small. No further improvement in the approximate solution x is possible.

4

iteration is not making good progress.

Description

find a zero of a system of n nonlinear functions in n variables by a modification of the powell hybrid method. Jacobian may be provided.

0 = fct(x) w.r.t x.

fct is an "external". This external returns v=fct(x) given x.

The simplest calling sequence for fct is:

[v]=fct(x).

If fct is a character string, it refers to a C or Fortran routine which must be linked to Scilab. Fortran calling sequence must be

fct(n,x,v,iflag)
integer n,iflag
double precision x(n),v(n)

and C Calling sequence must be

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

Incremental link is possible (help link).

jac is an "external". This external returns v=d(fct)/dx (x) given x.

The simplest calling sequence for jac is:

[v]=jac(x).

If jac is a character string, it refers to a to a C or Fortran routine which must be linked to Scilab calling sequences are the same as those for fct. Note however that v must be a nxn array.

Examples

// A simple example with 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

For some starting points and some equations system, the fsolve method can fail. The fsolve method is a local search method. So, to have a good chance to find a solution to your equations system, you must ship, a good starting point to fsolve.

Here is an example on which fsolve can fail:

// Another example with fsolve 
function F=feuler(x, r)
  F=x-r-dt*(x^2-x^3);
endfunction
function J=dFdx(x)  //definition de la derivee de 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 do not find the solution
disp(v); // The residual
disp(info); // The termination indicator

[x,v,info]=fsolve(1,list(feuler,r),dFdx); // fsolve find the solution
disp(v); // The residual
disp(info); // The termination indicator

clf();x=linspace(0,1,1000);plot(x,feuler(x))
a=gca();a.grid=[5 5];

So, each time you use fsolve, be sure to check the termination indicator and the residual value to see if fsolve has converged.

<< fit_dat Optimization and Simulation karmarkar >>

Copyright (c) 2022-2024 (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:
Wed Jan 26 16:23:42 CET 2011