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