|
Текст подпрограммы и версий ip03r_p.zip , ip03e_p.zip |
Тексты тестовых примеров tip03r_p.zip , tip03e_p.zip |
Полиномиальная интерполяция функции двух переменных, заданной на прямоугольной сетке, по модифицированной схеме Невилла.
Пусть заданы узлы неравномерной прямоугольной сетки:
X1A = { x1(1), x2(1), ..., xM(1) } ; X2A = { x1(2), x2(2), ..., xN(2) }
и значения функции f (x(1), x(2))
в узлах этой сетки: YA (I, J) = f (X1A(I), X2A(J)) ,
I = 1, 2, ..., M ; J = 1, 2, ..., N .
Предполагается, что
x1(1) < x2(1) < ... < xM(1) и x1(2) < x2(2) < ... < xN(2).
Подпрограмма IP03R вычисляет значение Y = f (X1, X2) в заданной точке плоскости с координатами (X1, X2) и оценку ошибки DY полученного значения. При этом по горизонтальному направлению используется интерполяционный полином степени MP, а по вертикальному направлению - интерполяционный полином степени NP. Вычисление соответствующих значений интерполяционных полиномов осуществляется по модифицированной схеме Невилла.
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.
procedure IP03R(var X1A :Array of Real; var X2A :Array of Real;
var YA :Array of Real; M :Integer; N :Integer;
MP :Integer; NP :Integer; X1 :Real;
X2 :Real; var Y :Real; var DY :Real;
var YM :Array of Real; var YN :Array of Real;
var C :Array of Real; var D :Array of Real;
var IERR :Integer);
Параметры
|
X1A - X2A | вещественные векторы длины M и N, содержащие узлы { x1 (1), x2 (1), ..., xM (1) } и { x1 (2), x2 (2), ..., xN (2) } соответственно; |
| YA - | вещественный двумерный массив размеров M на N, содержащий значения интерполируемой функции двух переменных в узлах заданной сетки; |
| M, N - | длины векторов X1A и X2A соответственно, M ≥ MP + 1, N ≥ NP + 1 (тип: целый); |
| MP, NP - | заданные степени интерполяционных полиномов, MP ≥ 1, NP ≥ 1 (тип: целый); |
| X1, X2 - | координаты заданной точки на плоскости, в которой ищется значение интерполируемой функции (тип: вещественный); |
| Y - | вещественная переменная, содержащая значение интерполируемой функции в заданной точке плоскости; |
| DY - | вещественная переменная, содержащая оценку ошибки вычисленного значения интерполируемой функции; |
| YM, YN - | вещественные векторы длины M и N соответственно, используемые в подпрограмме в качестве рабочих; |
| C, D - | вещественные векторы длины max (MP + 1, NP + 1), используемые в подпрограмме в качестве рабочих; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом |
| IERR=65 - | когда по крайней мере два узла сетки по какому - либо направлению совпадают; |
| IERR=66 - | когда число узлов сетки по какому - либо направлению меньше или равно степени соответствующего интерполяционного полинома. |
Версии
| IP03E - | полиномиальная интерполяция функции двух переменных, заданной на прямоугольной неравномерной сетке, по модифицированной схеме Невилла в режиме расширенной (Extended) точности; при этом параметры X1A, X2A, YA, X1, X2, Y, DY, YM, YN, C, D должны иметь тип Extended. |
Вызываемые подпрограммы
| IP02R - | вычисление значения интерполяционного полинома в заданной точке по модифицированной схеме Невилла. используется в подпрограмме IP03R; |
| IP02E - | вычисление значения интерполяционного полинома в заданной точке по модифицированной схеме Невилла в режиме расширенной (Extended) точности; используется в подпрограмме IP03E. |
Замечания по использованию
| Заданная точка на плоскости не обязательно должна лежать внутри заданной прямоугольной сетки. В этом случае подпрограмма IP03R и IP03E выполняют полиномиальную экстраполяцию двух переменных. |
Unit TIP03R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IP03R_p;
function TIP03R: String;
implementation
function TIP03R: String;
var
M,N,I,J,MP,NP,IERR :Integer;
R,X1,X2,Y,DY :Real;
X1A :Array [0..14] of Real;
X2A :Array [0..9] of Real;
YA :Array [0..149] of Real;
YN :Array [0..9] of Real;
YM :Array [0..14] of Real;
C :Array [0..5] of Real;
D :Array [0..5] of Real;
label
_1,_2,_3;
begin
Result := ''; { результат функции }
M := 15;
N := 10;
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
_3:
YA[(I-1)+(J-1)*15] := Sin(X1A[I-1])*Sin(X2A[J-1]);
end;
end;
МР := 5;
NP := 4;
X1 := 0.55;
X2 := 0.65;
IP03R(X1A,X2A,YA,M,N,MP,NP,X1,X2,Y,DY,
YM,YN,C,D,IERR);
Result := Result + Format(' %20.16f %20.16f ',[Y,DY]) + #$0D#$0A;
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
UtRes('TIP03R',Result); { вывод результатов в файл TIP03R.res }
exit;
end;
end.
Результаты:
Y = 0.316323
DY = 0.616967E-07
IERR = 0