intg — intégration numérique adaptative
[v,err]=intg(a,b,f [,ea [,er])
nombres réels
fonction externe (fonction Scilab ou chaîne de caractères ou liste).
nombres réels
erreur absolue désirée (1.d-14 par défaut)
erreur relative (1.d-8 par défaut)
estimation de l'erreur absolue sur le résultat
intg(a,b,f) approche l'intégrale de
a à b de f(t)dt.
La fonction f doit être continue.
L'évaluation satisfait si possible abs(I-v)<=
max(ea,er*abs(I)) où I représente la valeur exacte de
l'intégrale.
f est une fonction externe :
Si f est une fonction Scilab elle doit avoir la
liste d'appel : y = f(t)
Si f est une liste, cette liste doit avoir la
structure suivante : list(f,x1,x2,...) où
f est une fonction Scilab avec la liste d'appel :
f(t,x1,x2,...).
Si f est une chaîne de caractères, ce paramètre
désigne le nom d'un fonction Fortran ou d'une procédure C ayant une liste
d'appel fixée:
Dans le cas Fortran la liste d'appel doit être: double
precision function f(x) où x est aussi un
nombre double precision.
Dans la cas C la liste d'appel doit être: double f(double
*x).
//External écrit en Scilab
function y=f(x),y=x*sin(30*x)/sqrt(1-((x/(2*%pi))^2)),endfunction
exact=-2.5432596188;
I=intg(0,2*%pi,f)
abs(exact-I)
//External écrit en Scilab avec un argument
function y=f1(x,w),y=x*sin(w*x)/sqrt(1-((x/(2*%pi))^2)),endfunction
I=intg(0,2*%pi,list(f1,30))
abs(exact-I)
// External écrit en Fortran (un compilateur Fortran est nécessaire)
// Ecriture du code fortran
cd TMPDIR;
F=[' double precision function ffun(x)'
' double precision x,pi'
' pi=3.14159265358979312d+0'
' ffun=x*sin(30.0d+0*x)/sqrt(1.0d+0-(x/(2.0d+0*pi))**2)'
' return'
' end'];
mputl(F,TMPDIR+'/ffun.f')
// compilation du code Fortran
l=ilib_for_link('ffun','ffun.f',[],'f');
// link incrémental
link(l,'ffun','f')
// integration de la fonction
I=intg(0,2*%pi,'ffun')
abs(exact-I)
// External écrit en C (un compilateur C est nécessaire)
// Ecriture du code C
C=['#include <math.h>'
'double cfun(double *x)'
'{'
' double y,pi=3.14159265358979312;'
' y=*x/(2.0e0*pi);'
' return *x*sin(30.0e0**x)/sqrt(1.0e0-y*y);'
'}'];
mputl(C,TMPDIR+'/cfun.c')
// compilation du code C
l=ilib_for_link('cfun','cfun.f',[],'c');
// incremental linking
link(l,'cfun','c')
// integration de la fonction
I=intg(0,2*%pi,'cfun')
abs(exact-I)