definite integral
[v,err]=intg(a,b,f [,ea [,er])
:a, b real numbers. : :f external (function or list or string). : :ea, er real numbers. : :ea absolute error required on the result. Default value: 1.d-14. : :er relative error required on the result. Default value: 1.d-8. : :err estimated absolute error on the result. :
intg(a,b,f) evaluates the definite integral from a to b of f(t)dt. The function f(t) should be continuous.
The evaluation hopefully satisfies following claim for accuracy: abs(I-v)<= max(ea,er*abs(I)) where I stands for the exact value of the integral.
f is an external :
If f is function its definition must be as follows y = f(t)
If f is a list the list must be as follows: list(f,x1,x2,...) where f is a function with calling sequence f(t,x1,x2,...).
If f is a string it refers to a the name of a Fortran function or a C prodedure with a given calling sequence:
In the fortran case the calling sequence should be double precision function f(x) where x is also a double precision number.
In the C case the calling sequence should be double f(double *x) .
// Function written in the Scilab language
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)
// Function with an argument written in the Scilab language
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)
// Function written in Fortran (a Fortran compiler is required)
// define a Fortran function
`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,`fullfile`_(TMPDIR,'ffun.f'))
// compile the function
l=`ilib_for_link`_('ffun',`fullfile`_(TMPDIR,'ffun.f'),[],'f');
// add the function to the working environment
`link`_(l,'ffun','f')
// integrate the function
I=intg(0,2*%pi,'ffun')
`abs`_(exact-I)
// Function written in C (a C compiler is required)
// define a C function
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,`fullfile`_(TMPDIR,'cfun.c'))
// compile the function
l=`ilib_for_link`_('cfun',`fullfile`_(TMPDIR,'cfun.c'),[],'c');
// add the function to the working environment
`link`_(l,'cfun','c')
// integrate the function
I=intg(0,2*%pi,'cfun')
`abs`_(exact-I)
The associated routines can be found in SCI/modules/differential_equations/src/fortran directory :
dqag0.f and dqags.f from quadpack