Текст подпрограммы и версий iis1r_p.zip |
Тексты тестовых примеров tiis1r_p.zip |
Интерполирование параметрически заданной циклической функции по известным на неравномерной сетке значениям самой функции и ее вторых производных методом интерполирующих кубических сплайнов.
Пусть в узлах неравномерной ceтки t1 < t2 ... < tN известны значения параметрически заданной циклической функции x = x(t) и y = y(t) и ее вторых производных x'' = x''(t) и y'' = y''(t). Требуется найти значение этой функции в некоторой точке t0: t1 < t0 ≤ tN. Эта задача интерполяции решается в I IS1R посредством построения кубических полиномов по значениям ( ti, xi ) , ( ti, x''i ) , ( ti + 1, xi + 1 ) , ( ti + 1, x''i + 1 ) и ( ti, yi ) , ( ti, y''i ) , ( ti + 1, yi + 1 ) , ( ti + 1, y''i + 1 ) как интерполяционных полиномов Эрмита [1], [2].
1. |
И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, Физматгиз, 1962. |
2. | Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приближения, M., "Мир", 1972. |
procedure IIS1R(T0 :Real; N :Integer; var T :Array of Real; var X :Array of Real; var Y :Array of Real; var X2 :Array of Real; var Y2 :Array of Real; var X0 :Real; var Y0 :Real; var IERR :Integer);
Параметры
TO - | значение t0, в котоpом ищется параметрически заданная циклическая функция (тип: вещественный); |
N - | заданное число узлов сетки, N ≥ 3 (тип: целый); |
T - | вещественный одномерный массив значений ti размерности N; |
X - | вещественный одномерный массив значений xi размерности N; |
X2 - | вещественный одномерный массив вторых производных x''i размерности N; |
Y - | вещественный одномерный массив значений yi размерности N; |
Y2 - | вещественный одномерный массив вторых производных y''i размерности N; |
XO - | вещественная переменная, содержащая вычисленное значение x (t0); |
YO - | вещественная переменная, содержащая вычисленное значение  y (t0); |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
IERR=65 - | когда заданное значение TO не принадлежит полуинтервалу (t1, tN]. |
Версии: нет
Вызываемые подпрограммы
UTI I10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы I IS1R. |
Замечания по использованию: нет
На единичной окружности были взяты 17 точек. Значения векторов T, X, Y, X2 и Y2 определены в примере использования подпрограммы IDS6R.
Unit tiis1r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, IDS6R_p, IIS1R_p; function tiis1r: String; implementation function tiis1r: String; var N,NPAR,_i,IERR :Integer; T0,X0,Y0 :Real; T :Array [0..16] of Real; X2 :Array [0..16] of Real; Y2 :Array [0..16] of Real; F :Array [0..16] of Real; G :Array [0..16] of Real; H :Array [0..16] of Real; const X :Array [0..16] of Real = ( -1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75,1.0, 0.75,0.5,0.25,0.0,-0.25,-0.5,-0.75,1.0 ); Y :Array [0..16] of Real = ( 0.0,-0.66143775,-0.8660253,-0.9682457,-1.0, -0.9682457,-0.8660253,-0.66143775,0.0,0.66143775, 0.8660253,0.9682457,1.0,0.9682457,0.8660253, 0.66143775,0.0 ); begin Result := ''; { результат функции } N := 17; NPAR := 1; IDS6R(N,NPAR,T,X,X2,Y,Y2,F,G,H); Result := Result + #$0D#$0A; for _i:=0 to 16 do begin Result := Result + Format('%20.16f ',[X2[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 16 do begin Result := Result + Format('%20.16f ',[Y2[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; T0 := 1.0; N := 17; IIS1R(T0,N,T,X,Y,X2,Y2,X0,Y0,IERR); Result := Result + Format('%5d ',[IERR]) + #$0D#$0A; Result := Result + Format(' %20.16f %20.16f ',[X0,Y0]) + #$0D#$0A; UtRes('tiis1r',Result); { вывод результатов в файл tiis1r.res } exit; end; end. Результаты: XO = - 0.526 , YO = - 0.8505 , IERR = 0