Текст подпрограммы и версий qsj2r_c.zip |
Тексты тестовых примеров tqsj2r_c.zip |
Вычисление определенного интеграла по формуле Гаусса - Якоби с гарантированной точностью.
Подпрограмма qsj2r вычисляет определенный интеграл B ∫ ( 1 - x )α ( 1 + x ) β f (x) dx A
с заданной абсолютной погрешностью по квадратурной формуле Гаусса - Якоби.
int qsj2r_c(real *rint, real *a, real *b, real *alf, real *bta, R_fp f, integer *n, real *eps, integer *ierr)
Параметры
rint - | вещественная переменная, содержащая вычисленное значение интеграла; |
a, b - | заданные нижний и верхний пределы интегрирования, соответственно (тип: вещественный); |
alf,bta - | заданные параметры α и β соответственно, в весовом множителе (1 - x)α (1 + x) β (тип: вещественный); |
f - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
n - | целая переменная, задающая число узлов интегрирования (2 ≤ n ≤ 512); |
eps - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr=0 - | когда заданная точность eps достигнута, n при этом полагается равным числу узлов интегрирования, при котором достигнута заданная точность и вычислено значение интеграла; |
ierr=1 - | когда заданная точность не может быть достигнута при максимально возможном числе узлов интегрирования (n ≤ 512). |
Версии: нет
Вызываемые подпрограммы
qsjac_c - | подпрограмма, вычисляющая узлы и веса квадратурной формулы Гаусса - Якоби; |
utqsj2_c - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию
Перед началом работы подпрограммы число узлов интегрирования n должно быть задано как целое из интервала 2 ≤ n ≤ 256. | |
Если интеграл не может быть вычислен с заданной абсолютной
погрешностью eps, выдается диагностическое сообщение: Подпрограмма qsj2r_c: заданная точность не может быть достигнута. |
int main(void) { /* Local variables */ static int ierr; static float rint, a, b; extern int qsj2r_c(float *, float *, float *, float *, float *, R_fp, int *, float *, int *); extern float f_c(); static int n; static float alf, bta, eps; alf = 1.f; bta = alf; a = -1.f; b = 1.f; eps = 1e-5f; n = 2; qsj2r_c(&rint, &a, &b, &alf, &bta, (R_fp)f_c, &n, &eps, &ierr); printf("\n%16.7e%16.7e%16.7e%16.7e%16.7e \n",a,b,alf,bta,eps); printf("\n %16.7e %5i %5i \n",rint,n,ierr); return 0; } /* main */ float f_c(float *x) { /* System generated locals */ float ret_val, r__1, r__2; /* Computing 15th power */ r__1 = *x, r__2 = r__1, r__1 *= r__1, r__2 *= r__1, r__1 *= r__1, r__2 *= r__1; ret_val = r__2 * (r__1 * r__1); return ret_val; } /* f_c */ Результаты: rint = 0.0000000000 n = 8 ierr = 0