Текст подпрограммы и версий iac1r_p.zip |
Тексты тестовых примеров tiac1r_p.zip |
Вычисление сетки и коэффициентов аппроксимирующего кубического сплайна по заданным значениям функции одной переменной и краевым условиям на заданной (возможно неравномерной) сетке.
Пусть заданы сетка X ( I ),
I = 1, ..., NX и значения функции F (X)
на ней:
FX ( I ) = F ( X ( I ) ) ,
I = 1, ..., NX.
Могут быть заданы краевые условия.
Для определения сетки и вычисления коэффициентов воспользуемся формулами :
TX(I + 2) = X( I ) , CX( I + 2) = FX( I ) , I = 1, ..., NX.
При периодических функциях дополнительные узлы и значения функции определяются из условий периодичности :
TX(1) = X(NX - 2) - X(NX) + X(1) , CX(1) = FX(NX - 2) , TX(2) = X(NX - 1) - X(NX) + X(1) , CX(2) = FX(NX - 1) , TX(NX + 3) = X(2) + X(NX) - X(1) , CX(NX + 3) = FX(2) , TX(NX + 4) = X(3) + X(NX) - X(1) , CX(NX + 4) = FX(3) .
При непериодических функциях дополнительные значения функции вычисляются из краевых условий, приведенных в [1], а узлы определены формулами:
TX(1) = 3 * X(1) - 2 * X(2) , TX(NX + 3) = 2 * X(NX) - X(NX - 1) , TX(2) = 2 * X(1) - X(2) , TX(NX + 4) = 3 * X(NX) - 2 * X(NX - 1) .
После определения сетки сплайна и вычисления дополнительных значений функции вычисляются коэффициенты сплайна в зависимости от порядка аппроксимирующих формул [2].
1. | Гребенников А.И., Казе В.О. - Л. Быстрые алгоритмы аппроксимации функции сплайнами и решение некоторых прикладных задач. - Методы и алгоритмы в численном анализе. M.: Изд - во МГУ, 1984. |
2. | Гребенников А.И. Метод сплайнов и решение некоррректных задач теории приближений. M.: Изд - во МГУ, 1983. |
procedure IAC1R(var X :Array of Real; NX :Integer; var FX :Array of Real; LX :Integer; MXA :Integer; FXA :Real; MXB :Integer; FXB :Real; var TX :Array of Real; var CX :Array of Real);
Параметры
X - | вещественный вектоp длины NX, содержащий значения узлов исходной сетки; |
NX - | заданное число узлов исходной сетки. NX ≥ 4 (тип: целый); |
FX - | вещественный вектоp длины NX, содержащий значения функции в узлах исходной сетки; |
LX - | заданное число, порядок аппроксимирующих формул, 0 ≤ LX ≤ 1 (тип: целый); |
MXA - | заданное число, определяющее периодичность функции или тип краевых условий на левом конце отрезка, 0 ≤ MXA ≤ 3 (тип: целый); |
MXA = 3 - | периодическая функция, |
MXA = 0 - | условие интерполяции, |
MXA=1,2 - | задана производная порядка MXA; |
FXA - | заданное значение производной порядка MXA на левом конце отрезка (тип: вещественный), (используется, если MXA = 1, 2); |
MXB - | заданное число, определяющее тип краевых условий на правом конце отрезка, 0 ≤ MXB ≤ 2 (тип: целый), (используется, если MXA < 3), |
MXB = 0 - | условие интерполяции, |
MXB=1,2 - | задана производная порядка MXB; |
FXB - | заданное значение производной порядка MXB на правом конце отрезка (тип: вещественный), (используется, если MXB = 1, 2); |
TX - | вещественный вектоp длины NX + 4, содержащий вычисленные значения узлов сетки сплайна; |
CX - | вещественный вектоp длины NX + 4, содержащий NX + 2 значений коэффициентов сплайна. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма использует рабочие подпрограммы - функции и подпрограммы IAC1R1, IAC1R2, IAC1R3, IAC1R4 и IAS1R2. |
Unit TIAC1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, IAC1R_p; function TIAC1R: String; implementation function TIAC1R: String; var I :Integer; ТХ :Array [0..7] of Real; СХ :Array [0..7] of Real; const X :Array [0..3] of Real = ( 2.0,3.0,4.0,5.0 ); FX :Array [0..3] of Real = ( 8.0,27.0,64.0,125.0 ); begin Result := ''; { результат функции } IAC1R(X,4,FX,1,1,12.0,2,30.0,TX,CX); Result := Result + #$0D#$0A; for I:=1 to 8 do begin Result := Result + Format(' ТХ :%20.16f ',[TX[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 6 do begin Result := Result + Format(' СХ :%20.16f ',[CX[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TIAC1R',Result); { вывод результатов в файл TIAC1R.res } end; end. Результаты: TX = ( 0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 ) CX = ( -0.00 6.00 24.00 60.00 120.00 210.00 )