|
Текст подпрограммы и версий qs14r_c.zip |
Тексты тестовых примеров tqs14r_c.zip |
Вычисление определенного интеграла от комплекснозначной функции вещественного аргумента по квадратурной формуле Гаусса.
Пусть f (x) = f1 (x) + i f (x) - комплекснозначная функция вещественного аргумента, определенная на конечном отрезке [a, b], вычисляется
b
∫ f (x) dx ≈
a
N
≈ (b - a) ∑ cj f ( (b - a) yj / 2 + (a + b) / 2 ) / 2 = JN ,
j=1
где JN = J1N + i J2N, yj и cj соответственно узлы и веса Гаусса для отрезка [-1,1], i = √-1.
Число узлов интегрирования N принимает только следующие значения: 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96. Пусть n - номеp элемента указанного списка; обозначим J1N и J2N (N принимает перечисленные значения) через J1(n) и J2(n) соответственно.
B качестве приближенного значения интеграла берется J1 (n + 1) + i J2 (n + 1), если величина
E(n) = [ (J1(n+1) - J1(n))2 + (J2(n+1) - J2(n))2] / [(J1(n+1))2 + (J2(n+1))2 ]1/2
меньше или pавна заданной относительной точности вычисления интеграла E.
int qs14r_c (real *rint, real *a, real *b, S_fp f, real *e,
integer *n, integer *ierr)
Параметры
| rint - | вещественный вектоp длины 2 для вычисленных значений J1 (n + 1) и J2 (n + 1); |
| a, b - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
| f - | имя подпрограммы, вычисляющей подинтегральную функцию f (x); |
| e - | заданная относительная погрешность вычисления интеграла (тип: вещественный); |
| n - | целая переменная, задающая начальное число узлов интегрирования; |
| ierr - | целая переменная для диагностических сообщений: |
| ierr = 65 - |
когда список узлов исчерпан, а
заданная точность не достигнута, или (J1(n + 1))2 + (J2(n + 1))2 ≤ 10-10 ; |
| ierr = 66 - | когда заданное число узлов интегрирования не принадлежит списку допустимых значений узлов. |
Версии: нет
Вызываемые подпрограммы
| utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs14r_c. |
Замечания по использованию
| 1. |
Если ierr = 65, то n полагается равным -1. | |
| 2. |
При e ≤ 0 происходит вычисление интеграла только с заданным n. | |
| 3. |
Первый оператор подпрограммы f должен иметь вид: |
int main(void)
{
/* Local variables */
static int ierr;
extern int qs14r_c(float *, float *, float *, U_fp, float *, int *, int *);
static float rint[2], a, b, e;
extern int f_c();
static int n;
a = 1.f;
b = 20.085536923186663f;
e = 1e-5f;
n = 2;
qs14r_c(rint, &a, &b, (U_fp)f_c, &e, &n, &ierr);
printf("\n %5i \n",n);
printf("\n %16.7e %16.7e \n",rint[0],rint[1]);
return 0;
} /* main */
int f_c(float *x, float *f1, float *f2)
{
/* Builtin functions */
double log(double), sqrt(double);
*f1 = 1.f / (*x * (float)sqrt((float)((float)log(*x) + 1.f)));
*f2 = 1.f / *x;
return 0;
} /* f_c */
Результаты:
rint (1) = 1.9999999999
rint (2) = 3.0000000000
n = 32