|
Текст подпрограммы и версий iis9r_p.zip |
Тексты тестовых примеров tiis9r_p.zip |
Интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке.
Вычисляются коэффициенты C ( I, 3 ), C ( I, 2 ), C ( I, 1 ) кубического квази - эрмитова сплайна
S (x) = C ( I, 3 ) ( x - x I )3 + C ( I, 2 ) ( x - x I)2 + C ( I, 1 ) ( x - x I) + yI ,
где x ∈ [x I, x I + 1], I =1, 2, ..., N - 1, интерполирующего заданные значения табличной функции yI = y (x I), I = 1, 2, ..., N в узлах сетки {x ( I )}.
Коэффициенты сплайна на отрезке [xI, x I + 1] определяются значениями yI, yI + 1, yI - yI - 1, yI + 2 - yI + 1 и выбираются так, что функция S (x) непрерывна вместе со своей первой производной на всем отрезке [x 1, x N].
Akima H., "A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures", JACM, 17 (4), 1970, 589 - 602.
procedure IIS9R(var X :Array of Real; var Y :Array of Real;
NX :Integer; var C :Array of Real; var IERR :Integer);
Параметры
| X - | вещественный вектоp длины N, содержащий заданные узлы сетки, при этом X ( I ) < X ( I + 1); |
| Y - | вещественный вектоp длины N, содержащий заданные значения интерполируемой функции в узлах сетки: F ( I ) = Y ( I ); |
| N - | заданное количество узлов сетки, N ≥ 4 (тип: целый); |
| C - | вещественный двумерный массив размерности N * 3, содержащий вычисленные коэффициенты кубического квази - эрмитова сплайна; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| IERR=65 - | когда заданное количество N узлов сетки меньше четырех; |
| IERR=66 - | когда X ( I ) ≥ X ( I + 1) хотя бы для одного I. |
Версии: нет
Вызываемые подпрограммы
| UTI I10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы I IS9R. |
Замечания по использованию: нет
Unit tiis9r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IIS9R_p;
function tiis9r: String;
implementation
function tiis9r: String;
var
N,I,_i,J,IERR :Integer;
X :Array [0..4] of Real;
C :Array [0..14] of Real;
Y :Array [0..4] of Real;
label
_2;
begin
Result := ''; { результат функции }
N := 5;
for I:=1 to N do
begin
X[I-1] := I;
_2:
Y[I-1] := ((X[I-1]-2.0)*X[I-1]-3.0)*X[I-1]+4.0;
end;
IIS9R(X,Y,N,C,IERR);
Result := Result + Format('%s',[' IIS9R' + #$0D#$0A +
' Y']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[Y[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format(' %5d ',[IERR]) + #$0D#$0A;
Result := Result + Format('%s',[' C' + #$0D#$0A]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to 5 do
begin
for J:=1 to 3 do
begin
Result := Result + Format('%20.16f ',[C[(I-1)+(J-1)*5]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
UtRes('tiis9r',Result); { вывод результатов в файл tiis9r.res }
exit;
end;
end.
Результаты:
IERR = 0
| 0.0 |
| -2.0 |
Y = | 4.0 |
| 24.0 |
| 64.0 |
| -6.0 5.090909 -1.090909 |
| 0.909091 6.181818 -1.090909 |
C = | 10.0 11.764706 -1.764706 |
| 28.235294 13.592412 -1.764706 |
| 5.0 0.0 0.0 |