|
Текст подпрограммы и версий ip01r_p.zip , ip01e_p.zip |
Тексты тестовых примеров tip01r_p.zip , tip01e_p.zip |
Вычисление коэффициентов интерполяционного полинома
Пусть заданы узлы сетки x1, x2, ..., xN, упорядоченные по возрастанию: x1 < x2 < ...< xN и значения y1, y2, ..., yn функции f (x) в узлах этой сетки. Подпрограмма IP01R вычисляет коэффициенты ci ( i = 1, 2, ..., N ) интерполяционного полинома
P(x) = c1 + c2 x + c3 x2 + ... + cN xN-1 степени N - 1.
Отметим, что коэффициенты ci интерполяционного полинома удовлетворяют системе линейных алгебраических уравнений
| 1 x1 x12 ... x1N-1 | | c1 | | y1 |
| 1 x2 x22 ... x2N-1 | | c2 | = | y2 |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
| 1 xN xN2 ... xNN-1 | | cN | | yN |
с матрицей Вандермонда.
Решение этой системы с транспонированной матрицей осуществляется подпрограммой ASV1R .
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.
procedure IP01R(var X :Array of Real; var Y :Array of Real;
N :Integer; var COF :Array of Real;
var S :Array of Real);
Параметры
| X - | вещественный вектор длины N, содержащий узлы заданной сетки x1, x2, ..., xN, упорядоченной по возрастанию; |
| Y - | вещественный вектор длины N, содержащий значения y1, y2, ..., yN функции f (x) в узлах заданной сетки; |
| N - | количество узлов сетки, N ≥ 2 (тип: целый); |
| COF - | вещественный вектор длины N, содержащий вычисленные коэффициенты интерполяционного полинома; |
| S - | вещественный вектор длины N, используемый в подпрограмме в качестве рабочего. |
Версии
| IP01E - | вычисление коэффициентов интерполяционного полинома в режиме расширенной (Extended) точности; при этом параметры X, Y, COF и S должны иметь тип Extended. |
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Unit tip01r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IP01R_p;
function tip01r: String;
implementation
function tip01r: String;
var
N,K,J,_i :Integer;
A,B :Real;
X :Array [0..4] of Real;
Y :Array [0..4] of Real;
COF :Array [0..4] of Real;
S :Array [0..4] of Real;
X1 :Array [0..4] of Real;
Y1 :Array [0..4] of Real;
const
SYS001 :Real = 3.1415926535897932384626433832795;
label
_1,_5;
begin
Result := ''; { результат функции }
N := 5;
A := 0.0;
B := 1.0;
for K:=1 to N do
begin
X1[K-1] := (B+A)/2+((B-A)/2)*Cos((2*K-1)*SYS001/(2*N));
_1:
Y1[K-1] := Sin(X1[K-1])/X1[K-1];
end;
for J:=1 to N do
begin
K := N-J+1;
X[K-1] := X1[J-1];
_5:
Y[K-1] := Y1[J-1];
end;
IP01R(X,Y,N,COF,S);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[COF[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('tip01r',Result); { вывод результатов в файл tip01r.res }
exit;
end;
end.
Результаты:
COF = ( 0.999999, 0.202257E-04,
-0.166825, 0.464717E-03, 0.781631E-02 )