|
Текст подпрограммы и версий qtsxr_c.zip qtsxd_c.zip |
Тексты тестовых примеров tqtsxr_c.zip tqtsxd_c.zip |
Вычисление неопределенного двукратного интеграла от табличной функции, заданной на неравномерной сетке, по квадратурной формуле, точной для многочленов второй степени.
Вычисляются значения неопрeдeлeнного двойного интеграла по прямоугольникам x1 ≤ x ≤ xi, y1 ≤ y ≤ yj, от табличной функции f (x, y), заданной на неравномерной сетке (xi, yj), i = 1, 2, ..., N, j = 1, 2, ..., M, по квадратурной формуле, точной для многочленов второй степени.
Н.С.Бахвалов. Численные методы, "Hаука", 1975.
int qtsxr_c (real *rint, real *x1, real *x2, real *f,
integer *n, integer *m)
Параметры
| rint - | вещественный двумерный массив размера n на m, содержащий вычисленные значения неопределенного интеграла; |
| x1 - | вещественный вектоp длины n, содержащий значения узлов неравномерной сетки по x; |
| x2 - | вещественный вектоp длины m, содержащий значения узлов неравномерной сетки по y; |
| f - | вещественный двумерный массив размера n на m, содержащий значения подинтегральной функции f (x, y); |
| n - | заданное число узлов сетки по x (тип: целый); |
| m - | заданное число узлов сетки по y (тип: целый). |
Версии
| qtsxd_c - | вычисление с удвоенной точностью неопределенного двукратного интеграла от табличной функции, заданной на неравномерной сетке, по квадратурной формуле, точной для многочленов второй степени. |
Вызываемые подпрограммы: нет
Замечания по использованию
|
Требуется, чтобы n ≥ 4 и m ≥ 4. В подпрограмме qtsxd_c параметры rint, x1, x2, f имеют тип double. |
int main(void)
{
/* Builtin functions */
double sin(double);
/* Local variables */
static float rint[2000] /* was [50][40] */,
f[2000] /* was [50][40] */;
static int i__, j, m, n;
static float x, h1, h2, x1[50], x2[40];
extern int qtsxr_c(float *, float *, float *, float *, int *, int *);
int i__1, i__2;
#define rint_ref(a_1,a_2) rint[(a_2)*50 + a_1 - 51]
#define f_ref(a_1,a_2) f[(a_2)*50 + a_1 - 51]
h1 = .064114081632653058f;
h2 = .08055358974358974f;
n = 50;
m = 40;
x1[0] = 0.f;
x2[0] = 0.f;
x1[1] = h1 / 4.f;
x2[1] = h2 / 4.f;
i__1 = n;
for (i__ = 3; i__ <= i__1; ++i__) {
/* l1: */
x1[i__ - 1] = x1[i__ - 3] + h1 * 2.f;
}
i__1 = m;
for (j = 3; j <= i__1; ++j) {
/* l2: */
x2[j - 1] = x2[j - 3] + h2 * 2.f;
}
i__1 = n;
for (i__ = 1; i__ <= i__1; ++i__) {
i__2 = m;
for (j = 1; j <= i__2; ++j) {
x = x1[i__ - 1] + x2[j - 1];
/* l3: */
f_ref(i__, j) = (float)sin(x);
}
}
qtsxr_c(rint, x1, x2, f, &n, &m);
printf("\n %16.7f %16.7f %16.7f %16.7f \n",
rint_ref(1, 1), rint_ref(2, 2), rint_ref(n-1, m), rint_ref(n, m));
return 0;
} /* main */
Результаты:
rint(1, 1) = 0.00000
rint(2, 2) = 0.00001
rint(n-1, m) = 0.24858
rint(n, m) = 0.21648