Текст подпрограммы и версий 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 )