Текст подпрограммы и версий ia11r_p.zip |
Тексты тестовых примеров tia11r_p.zip |
Вычисление сеток и коэффициентов бикубического аппроксимирующего сплайна, приближающего заданную функцию двух переменных или ее смешанные производные до второго порядка с заданной точностью.
Пусть задана действительная функция F (X, Y), принадлежащая к классу (2*LX + 2, 2*LY + 2) раз дифференцируемых функций, где LХ и LY порядки аппроксимирующих формул по X и по Y.
Задача приводится к решению двух одномерных задач с точностью EPS/2, используя оценки погрешности приближения, приведенные в [1].
Единственным требованием является то, что область определения функции должна быть шире области, в которой ищутся оптимальные сетки.
Если по какой - то переменной заданная точность не достигается, выдается для этой переменной максимально допустимая равномерная сетка.
1. Завьялов Ю.С., Kвасов Б.И., Мирошниченко В.Л. Методы сплайн - функций. M.: Hаука, 1980.
procedure IA11R(FUNXY :Func_F4; AX :Real; BX :Real; AY :Real; BY :Real; EPS :Real; LX :Integer; LY :Integer; IDX :Integer; IDY :Integer; JX :Integer; JY :Integer; var NX :Integer; var NY :Integer; var TX :Array of Real; var TY :Array of Real; var CXY :Array of Real; NCX :Integer; NCY :Integer; var CX :Array of Real; var CY :Array of Real);
Параметры
XYF - | имя вещественной подпрограммы - функции, вычисляющей значения аппроксимируемой функции; |
AX - | заданное число, начало отрезка по X (тип: вещественный); |
BX - | заданное число, конец отрезка по X, BX > AX (тип: вещественный); |
AY - | заданное число, начало отрезка по Y (тип: вещественный); |
BY - | заданное число, конец отрезка по Y, BY > AY (тип: вещественный); |
EPS - | заданное число, требуемая точность приближения, EPS ≥ 2* (10 - 6), (тип: вещественный); |
LX - | заданное число, порядок аппроксимирующей формулы по X, 0 ≤ LX ≤ 1 (тип: целый); |
LY - | заданное число, порядок аппроксимирующей функции по Y, 0 ≤ LY ≤ 1 (тип: целый); |
IDX - | заданное число, порядок приближаемой производной по X, 0 ≤ IDX ≤ LX + 1 (тип: целый); |
IDY - | заданное число, порядок приближаемой производной по Y, 0 ≤ IDY ≤ LY + 1 (тип: целый); |
JX - | заданное число, признак формируемой сетки по X, 0 ≤ JX ≤ 1 (тип: целый); |
JX = 0 - равномерная сетка ; JX = 1 - неравномерная сетка ; |
JY - | заданное число, признак формируемой сетки по Y, 0 ≤ JY ≤ 1 (тип: целый); |
JY = 0 - равномерная сетка ; JY = 1 - неравномерная сетка; |
NX - | целое число узлов равномерной сетки по X, на котоpом получают оценки нужных производных, 6 ≤ NX ≤ NCX - 8; на выходе содержит значение оптимального числа узлов по X; |
NY - | целое число узлов равномерной сетки по Y, на котоpом получают оценки нужных производных, 6≤NY≤NCY-8; на выходе содержит значение оптимального числа узлов по Y; |
TX - | вещественный вектоp длины NCX, содержащий NX + 4 вычисленных значений узлов сетки по X; |
TY - | вещественный вектоp длины NCY, содержащий NY + 4 вычисленных значений узлов сетки по Y; |
CXY - | вещественный двумерный массив, содержащий вычисленные коэффициенты сплайна размерностью NCX*NCY; |
NCX - | заданное число стpок массива CXY, NCX ≥ 14 (тип: целый); |
NCY - | заданное число стpок массива CXY, NCY ≥ 14 (тип: целый); |
CX - | вещественный рабочий вектоp длины NCX; |
CY - | вещественный рабочий вектоp длины NCY. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма использует рабочие подпрограммы - функции и подпрограммы IAC1R1, IA10R1 и IAS1R2. |
Unit TIA11R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FIA11R_p, IA11R_p; function TIA11R: String; implementation function TIA11R: String; var NX,NY,I :Integer; ТХ :Array [0..48] of Real; TY :Array [0..48] of Real; СХ :Array [0..48] of Real; CY :Array [0..48] of Real; CXY :Array [0..2400] of Real; begin Result := ''; { результат функции } NX := 41; NY := 41; IA11R(FIA11R,-1.0,1.0,-1.0,1.0,0.0002,1,1,0,0,1,1,NX, NY,TX,TY,CXY,49,49,CX,CY); Result := Result + #$0D#$0A; for I:=1 to 2 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 2 do begin Result := Result + Format(' TY :%20.16f ',[TY[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TIA11R',Result); { вывод результатов в файл TIA11R.res } exit; end; end. Результаты: | -1.1447 -1.0724 -1.0000 -0.9276 -0.8539 -0.7786 -0.7016 | TX = | -0.6225 -0.5410 -0.4566 -0.3686 -0.2757 -0.1759 -0.0641 | | 0.0744 0.1848 0.2840 0.3764 0.4640 0.5481 0.6294 | | 0.7083 0.7852 0.8603 0.9339 1.0000 1.0661 1.1322 | | -1.1447 -1.0724 -1.0000 -0.9276 -0.8539 -0.7786 -0.7016 | TY = | -0.6225 -0.5410 -0.4566 -0.3686 -0.2757 -0.1759 -0.0641 | | 0.0744 0.1848 0.2840 0.3764 0.4640 0.5481 0.6294 | | 0.7083 0.7852 0.8603 0.9339 1.0000 1.0661 1.1322 |