определённый интеграл
[v,err]=intg(a,b,f [,ea [,er])
вещественные числа
внешняя функция (функция, список или строка)
вещественные числа
абсолютная ошибка, требуемая для результата. Значение по умолчанию: 1.d-13.
относительная ошибка, требуемая для результата. Значение по умолчанию: 1.d-8.
оцененная абсолютная ошибка результата.
intg(a,b,f) вычисляет определённый интеграл функции
f(t) по dt в пределах от
a до b.
Функция f(t) должна быть непрерывной.
Вычисление, как можно ожидать, удовлетворяет следующему условию точности:
abs(I-v)<= max(ea,er*abs(I)), где
I -- точное значение интеграла.
f -- внешняя функция:
Если f -- функция, то её определение должно иметь вид
y = f(t).
Если f -- список, то этот список должен быть в виде:
list(f,x1,x2,...), где f --
функция с последовательностью вызова f(t,x1,x2,...).
Если f -- строка, то она ссылается на имя либо
процедуры Fortran либо функции C с заданной последовательностью вызова:
в случае Fortran вызывающая последовательность должна быть
в виде double precision function f(x), где
x также является числом двойной точности.
В случае C вызывающая последовательность должна быть
double f(double *x).
// Функция, написанная на языке 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) // Функция с аргументом, написанном на языке Scilab 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) // Функция, написанная на Fortran (требуется компилятор Fortran) // определение функции 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,'ffun.f') // компилируем функцию l=ilib_for_link('ffun','ffun.f',[],'f'); // добавляем функцию в рабочее окружение link(l,'ffun','f') // интегрируем функцию I=intg(0,2*%pi,'ffun') abs(exact-I) // Функция, написанная на C (требуется компилятор C) // определение 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,'cfun.c') // компилируем функцию l=ilib_for_link('cfun','cfun.c',[],'c'); // добавляем функцию в рабочее окружение link(l,'cfun','c') // интегрируем функцию I=intg(0,2*%pi,'cfun') abs(exact-I) | ![]() | ![]() |
Связанные подпрограммы можно найти в директории SCI/modules/differential_equations/src/fortran:
dqags.f и dqagse.f из quadpack