|
Текст подпрограммы и версий 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