Текст подпрограммы и версий ia80r_p.zip |
Тексты тестовых примеров tia80r_p.zip |
Рациональная Чебышевская аппроксимация вещественной функции на конечном интервале.
IA80R вычисляет лучшую в смысле Чебышева рациональную аппроксимацию с некоторым весом вещественной непрерывной на отрезке [a, b] функции F (X) :
R*[PHI(X)] = ( P1 + P2* PHI(X) + ... + PN+1* PHI(X)N ) / / ( Q1 + Q2* PHI(X) + ... + QM+1* PHI(X)M ) ,
причем R* [ PHI (X)] обладает тем свойством, что на ней достигается минимум
max | R[PHI(X)] - F(X) | / | G(X) | . [A, B]
Минимизация проводится на классе рациональных функций R [ РНI (Х)], имеющих степенью числителя N, а степенью знаменателя M.
W.J.Cody, W.Fraser, J.F.Hart, Rational Chebyshev Approximation Using Linear Equations, Numerishe Mathematik, 12 (4), 1968.
procedure IA80R(F :Func_F1; PHI :Func_F1; G :Func_F1; A :Real; B :Real; EPS :Real; N :Integer; M :Integer; var P :Array of Real; var Q :Array of Real; var RAB :Array of Real; var IERR :Integer);
Параметры
F - | имя вещественной подпрограммы - функции вычисления функции F (X); |
PHI - | имя вещественной подпрограммы - функции вычисления функции PHI (X); |
G - | имя вещественной подпрограммы - функции вычисления функции G (X); |
A, B - | заданные нижняя и верхняя границы отрезка, на котоpом производится аппроксимация (тип: вещественный); |
EPS - | заданная точность вычисления аппроксимации (тип: вещественный); |
N, M - | заданные степень числителя и знаменателя (тип: целый); |
P - | вещественный вектоp длины N + 1, в который помещаются коэффициенты числителя; |
Q - | вещественный вектоp длины M + 1, в который помещаются коэффициенты знаменателя; |
RAB - | вещественный вектоp длины (N + M + 8) * (N + M + 2) , используемый в подпрограмме как рабочий; в RAB (1) помещается вычисленное значение наилучшего приближения; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
IERR=65 - | когда заданная точность не может быть достигнута; |
IERR=66 - | когда алгоритм не сходится; возможно, что знаменатель имеет корень на заданном отрезке; |
IERR=67 - | когда сходимость не может быть достигнута в пределах 20 итераций; |
IERR=68 - | когда алгоритм не сходится из - за сингулярности матрицы системы уравнений для определения P и Q; |
IERR=69 - | когда получена хорошая аппроксимация, но не обязательно наилучшая в смысле Чебышева. |
Версии: нет
Вызываемые подпрограммы
UTIA10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы IA80R. |
Замечания по использованию
Если IERR = 65, то числитель и знаменатель имеют общие множители. B этом случае значения N и M следует уменьшить на 1. Bо всех других случаях, когда IERR ≠ 0, следует попытаться или уменьшить степени числителя и знаменателя, или изменить пределы отрезка, или уменьшить точность вычислений. |
Пусть требуется аппроксимировать функцию √ x на [0.5, 2.] следующим образом:
x / 4. + ( P1 + P2* x ) / ( Q1 + Q2* x ) .Unit TIA80R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FFIA80R_p, FPIA80R_p, FGIA80R_p, IA80R_p; function TIA80R: String; implementation function TIA80R: String; var N,M,_i,IERR :Integer; A,B,EPS :Real; P :Array [0..1] of Real; Q :Array [0..1] of Real; RАВ :Array [0..39] of Real; begin Result := ''; { результат функции } for _i:=0 to 39 do //обнуление рабочего массива RAB[_i] := 0.0; A := 0.5; B := 2.0; EPS := 1.E-2; N := 1; M := 1; IA80R(FFIA80R,FPIA80R,FGIA80R,A,B,EPS,N,M,P,Q,RAB,IERR); Result := Result + Format(' %20.16f %20.16f %20.16f %5d %5d ', [A,B,EPS,N,M]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 1 do begin Result := Result + Format('%20.16f ',[P[_i]]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 1 do begin Result := Result + Format('%20.16f ',[Q[_i]]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format(' %20.16f %20.16f %5d ', [RAB[0],RAB[1],IERR]) + #$0D#$0A; UtRes('TIA80R',Result); { вывод результатов в файл TIA80R.res } exit; end; end. Результаты: RAB (1) = -0.000319 ; IERR = 0 ; P (1) = 0.232604 , P (2) = 1.32410 ; Q (1) = 1. , Q (2) = 1.074789