|
Текст подпрограммы и версий id24r_c.zip |
Тексты тестовых примеров tid24r_c.zip |
Вычисление методом аппроксимирующих сплайнов значения смешанной производной табличной функции двух переменных, заданной на равномерной прямоугольной сетке.
Пусть на равномерной прямoyгoльной сетке (xi, yj), i = 1, ..., M1, j = 1, ..., M2, с шагами H1 и H2 по x и y соответственно, заданы значения функции fi j = f (xi, yj).
По точке (X Y), в которой требуется произвести вычисления, определяются номеpа K и L такие, что X ∈ [xK, xK + 1], Y ∈ [yL, yL + 1]. Значение производной порядка P по x и порядка Q по y ( 0 ≤ P ≤ 2N - 2, 0 ≤ Q ≤ 2N - 2 ) при K, L: N ≤ K ≤ M1 - N, N ≤ L ≤ M2 - N вычисляется по формуле:
S (P,Q) (X,Y) = CN2 *
K+N L+N
* ∑ ∑ fi j s(P)i,2N (X) s(Q)j,2N (Y) ,
i=K-N+1 j=L-N+1
где C1 = 1, C2 = 2/3, C3 = 11/20, C4 = 151/315, si, 2N (Х) и sj, 2N (Y) - суть В - сплайны порядка 2N, а N = 1, 2, 3, 4. При других K и L вычисления ведутся по формуле Тейлора.
Гребенников А.И. Алгоритм быстрой аппроксимации функций двух переменных и их производных сплайнами на равномерной сетке. B сб. "Численный анализ на ФОРТРАНе", вып.20, Изд-во МГУ, 1977.
int id24r_c (integer *p, integer *q, integer *n1, integer *m1,
integer *m2, real *h1, real *h2, real *a1, real *a2, real *x, real *y,
real *f, real *s, integer *ierr)
Параметры
| p, q - | целые переменные, значения которых на единицу больше порядка вычисляемой производной по x и y соответственно (при p = 1, q = 1 вычисляется значение сплайна) 1 ≤ p ≤ 2n - 1, 1 ≤ q ≤ 2n - 1; |
| n1 - | порядок сплайна, n1 = 2n, 1 ≤ n ≤ 4 (тип: целый); |
| m1 - | число узлов на оси x (тип: целый); |
| m2 - | число узлов на оси y (тип: целый); |
| h1 - | шаг сетки по оси x (тип: вещественный); |
| h2 - | шаг сетки по оси y (тип: вещественный); |
| a1 - | координата первого узла на оси x (тип: вещественный); |
| a2 - | координата первого узла на оси y (тип: вещественный); |
| x, y - | координаты точки, в которой производятся вычисления производной (тип: вещественный); |
| f - | двумерный вещественный массив размерности m1 на m2 заданных значений функций; |
| s - | вещественная переменная, содержащая результат вычислений; |
| ierr - | целая переменная, значение которой указывает причину возможной ошибки: |
| ierr=1 - | шаги сетки слишком малы; |
| ierr=2 - | точка (x, y) лежит вне допустимой области [x1, xm1] * [y1, ym2]; |
| ierr=3 - | невеpно задан порядок сплайна; |
| ierr=4 - | невеpно задан порядок производной. |
Версии: нет
Вызываемые подпрограммы
| uti i12_c - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию: нет
int main(void)
{
/* Builtin functions */
double exp(double);
/* Local variables */
extern int id24r_c(int *, int *, int *, int *, int *, float *, float *,
float *, float *, float *, float *, float *, float *,
int *);
static int ierr;
static float f[121] /* was [11][11] */;
static int i__, j;
static float s, x[11], y[11];
static int ip, iq;
#define f_ref(a_1,a_2) f[(a_2)*11 + a_1 - 12]
ip = 1;
iq = 1;
for (i__ = 1; i__ <= 11; ++i__) {
x[i__ - 1] = (i__ - 1) * .1f;
for (j = 1; j <= 11; ++j) {
y[j - 1] = (j - 1) * .1f;
/* l5: */
f_ref(i__, j) = (float)exp((float)(-x[i__ - 1] * x[i__ - 1] -
y[j - 1] * y[j - 1]));
}
}
id24r_c(&ip, &iq, &c__4, &c__11, &c__11, &c_b5, &c_b5, &c_b7, &c_b7, &c_b9,
&c_b10, f, &s, &ierr);
printf("\n %16.7e \n",s);
return 0;
} /* main */
Результатат: s = 0.70865