|
Текст подпрограммы и версий iib9r_p.zip , iib9e_p.zip |
Тексты тестовых примеров tiib9r_p.zip , tiib9e_p.zip |
Вычисление значения в заданной точке интерполируемой функции двух переменных, определенной на прямоугольной неравномерной сетке, по известным значениям на этой сетке ее второй частной производной по второй переменной и по известным значениям ее первой частной производной по первому направлению в точках, лежащих на левой и правой сторонах сеточного прямоугольника с координатами по второй переменной, совпадающими со второй координатой заданной точки, методом бикубических сплайнов.
Пусть заданы узлы неравномерной прямоугольной сетки:
X1A = { x1(1), x2(1), ..., xM(1) } ; X2A = { x1(2), x2(2), ..., xN(2) } ,
значения интерполируемой функции f (x(1), x(2))
и ее второй частной производной ∂(2) f (x(1), x(2)) / ∂x(2) 2
в узлах этой сетки:
YA(I, J) = f (X1A(I), X2A(J)) ; Y2A(I, J) = ∂2 f (X1A(I), X2A(J)) / ∂x(2) 2 ,
I = 1, 2, ..., M ; J = 1, 2, ..., N ,
а также следующие значения первой частной производной функции f по первой переменной:
YP1 = ∂ f (X1A(1), X2)) / ∂x(1) , YPM = ∂ f (X1A(M), X2) / ∂x(1) .
Здесь X2 - вторая координата заданной точки (X1, X2) внутри сеточного прямоугольника, в которой ищется значение интерполируемой функции: Y = f (X1, X2). Используется метод бикубических сплайнов.
Н.С.Бахвалов, Численные методы. Изд - во "Наука", 1973.
procedure IIB9R(var X1A :Array of Real; var X2A :Array of Real;
var YA :Array of Real; var Y2A :Array of Real;
M :Integer; N :Integer; X1 :Real;
X2 :Real; YP1 :Real; YPM :Real;
var Y :Real; var YT :Array of Real;
var Y2T :Array of Real; var YYT :Array of Real;
var U :Array of Real);
Параметры
|
X1A - X2A | вещественные векторы длины M и N, содержащие узлы {x1 (1), x2 (1), ...,xM (1)} и {x1 (2), x2 (2), ...,xN (2)} соответственно; |
| YA - | вещественный двумерный массив размеров M на N, содержащий значения интерполируемой функции f (x (1), x (2)) двух переменных в узлах заданной сетки; |
| Y2A - | вещественный двумерный массив размеров M и N, содержащий значения второй частной производной функции f по второй переменной в узлах заданной сетки; |
| M, N - | длины векторов X1A и X2A соответственно (тип: целый); |
| X1, X2 - | координаты заданной точки внутри сеточного прямоугольника, в которой ищется значение интерполируемой функции f (тип: вещественный); |
|
YP1 - YPM | заданные значения первой частной производной функции f по первой переменной в точках (X1A (1), X2) и (X1A (M), X2) соответственно (тип: вещественный); |
| Y - | вещественная переменная, содержащая вычисленное значение интерполируемой функции f в точке (X1, X2); |
| YT - | вещественный вектор длины N, используемый в подпрограмме в качестве рабочего; |
| Y2T - | вещественный вектор длины max (M, N), используемый в подпрограмме в качестве рабочего; |
| YYT, U - | вещественные векторы длины M, используемые в подпрограмме в качестве рабочих. |
Версии
| I IB9E - | выполняет те же вычисления, что и подпрограмма I IB9R, однако в режиме расширенной (Extended) точности. При этом все формальные параметры, кроме M и N, должны иметь тип Extended. |
Вызываемые подпрограммы
|
IDS8R - IDS8E | вычисление вторых производных таблично - заданной функции в узлах неравномерной сетки методом кубических или натуральных кубических сплайнов при заданных первых производных функции в концевых узлах сетки в режиме одинарной и расширенной (Extended) точности соответственно; используются в подпрограммах I IB9R и I IB9E соответственно. |
|
I IS8R - I IS8E | вычисление значения в заданной точке интерполируемой табличной функции, определенной в узлах неравномерной сетки, упорядоченной по возрастанию, по известным значениям ее второй производной в узлах этой сетки методом кубических сплайнов в режиме одинарной и расширенной (Extended) точности соответственно; используются в подпрограммах I IB9R и I IB9E соответственно. |
Замечания по использованию: нет
Unit TIIB9R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IIB9R_p;
function TIIB9R: String;
implementation
function TIIB9R: String;
var
M,N,I,J :Integer;
R,X1,X2,YP1,YPM,Y1T,Y :Real;
X1A :Array [0..4] of Real;
X2A :Array [0..3] of Real;
YA :Array [0..19] of Real;
Y2A :Array [0..19] of Real;
YT :Array [0..3] of Real;
Y2T :Array [0..4] of Real;
YYT :Array [0..4] of Real;
U :Array [0..4] of Real;
label
_1,_2,_4;
begin
Result := ''; { результат функции }
M := 5;
N := 4;
R := 0.0;
for I:=1 to M do
begin
X1A[I-1] := R;
_1:
R := R+0.1;
end;
R := 0.0;
for I:=1 to N do
begin
X2A[I-1] := R;
_2:
R := R+0.1;
end;
for I:=1 to M do
begin
for J:=1 to N do
begin
YA[(I-1)+(J-1)*5] := Sin(X1A[I-1])*Sin(X2A[J-1]);
_4:
Y2A[(I-1)+(J-1)*5] := -YA[(I-1)+(J-1)*5];
end;
end;
X1 := 0.55;
X2 := 0.65;
YP1 := Cos(X1A[0])*Sin(X2);
YРМ := Cos(X1A[M-1])*Sin(X2);
IIB9R(X1A,X2A,YA,Y2A,M,N,X1,X2,YP1,YPM,Y,
YT,Y2T,YYT,U);
Y1T := Sin(X1)*Sin(X2);
Result := Result + Format(' %20.16f %20.16f ',[Y,Y1T]) + #$0D#$0A;
UtRes('TIIB9R',Result); { вывод результатов в файл TIIB9R.res }
exit;
end;
end.
Результат: Y = 0.316370