|
Текст подпрограммы и версий ii20r_p.zip |
Тексты тестовых примеров tii20r_p.zip |
Дробно - рациональная интерполяция функции, заданной на конечном интервале.
Пусть на интервале [u, v] задана функция f (x). Вычисляется дробно - рациональная функция вида
p+1 q+1
R (x) = ( ∑ A k * Tk - 1 ( z ) ) / ( ∑ B k * Tk - 1 ( z ) ) ≡
k = 1 k = 1
p+1 q+1
≡ ( ∑ C k x k - 1 ) / ( ∑ D k x k - 1 ) ,
k = 1 k = 1
где z = ( 2x - u - v ) / ( v - u ) для x ∈ [u , v], Tk ( z ) - полином Чебышева 1 - го рода степени k, B1 = D1 = 1, p, q - заданные натуральные числа, удовлетворяющая условиям интерполяции:
R ( x j ) = f ( x j )
в узлах x j = 0.5 * ( u + v - ( v - u ) cos y j ), где y j = ( j - 0.5 ) * π / ( p + q + 1 ), j = 1, 2, ..., p + q + 1.
Для найденного R (x) в узлах сетки x k = 0.5 * ( u + v + ( v - u ) cos f k ), f k = ( k - 1 ) * π / ( p + q + 1 ), k = 1, 2, ..., p + q + 2, вычисляются характеристики точности интерполяции
E1 = max k | Δ f k | , E2 = max k | Δ k / f k | ,
EPS1 = E1 / min k | Δ k | , EPS2 = E2 / min k | Δ k | ,
где
f k = f ( x k ) , Δ k = f ( x k ) - R ( x k ) .
Curtis A., Osborne M.R. The construction of minimax rational approximations to functions, Computer J., 1966, v.9, N 3, 286 - 293.
procedure II20R(IP :Integer; IQ :Integer; U :Real; V :Real;
FUNCT :Func_F1; var A :Array of Real;
var B :Array of Real; var AL :Array of Real;
var BE :Array of Real; var RAB :Array of Real;
var RAB1 :Array of Real; var RAB2 :Array of Real;
var RAB3 :Array of Real; var RAB4 :Array of Real;
var IERR :Integer);
Параметры
| IP, IQ - | заданные степени числителя p и знаменателя  q, IP ≥ 0, IQ ≥ 0 (тип: целый); |
| U, V - | заданные нижняя и верхняя границы интервала интерполяции (тип: вещественный); |
| FUNCT - | имя вещественной подпрограммы - функции вычисления значений f (x); |
| A - | вещественный вектоp длины IP + 1 значений a k = A[K]; |
| B - | вещественный вектоp длины IQ + 1 значений b k = B[K]; |
| AL - | вещественный вектоp длины IP + 1 значений c k = AL[K]; |
| BE - | вещественный вектоp длины IQ + 1 значений d k = BE[K]; |
| RAB - | вещественный вектоp длины IQ, используемый в подпрограмме как рабочий; |
| RAB1 - | вещественный двумерный массив размера 3 * (2 ( IP + IQ + 1) + 1), используемый в подпрограмме как pабочий; |
| RAB2 - | вещественный двумерный массив размера 6 * ( IP + IQ + 2), используемый как рабочий; после окончания работы подпрограммы в нем запоминаются хаpактеристики интерполяции E1 = RAB2 (1, 1), E2 = RAB2 (2, 1), EPS1 = RAB2 (3, 1), EPS2 = RAB2 (4, 1); |
| RAB3 - | вещественный вектоp длины IP + 1, используемый в подпрограмме как рабочий; |
| RAB4 - | вещественный двумерный массив размера IQ * IQ, используемый в подпрограмме как pабочий; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| IERR=65 - | когда вычисленный знаменатель искомого приближения имеет корень в интервале [u, v]; |
| IERR=66 - | когда матрица для определения коэффициентов приближения вырождена. |
Версии: нет
Вызываемые подпрограммы
| UTI I10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы I I20R. |
Замечания по использованию: нет
Unit TII20R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FII20R_p, II20R_p;
function TII20R: String;
implementation
function TII20R: String;
var
IP,IQ,_i,K,IERR :Integer;
U,V :Real;
A :Array [0..2] of Real;
B :Array [0..2] of Real;
AL :Array [0..2] of Real;
ВЕ :Array [0..2] of Real;
RАВ :Array [0..1] of Real;
RAB1 :Array [0..32] of Real;
RAB2 :Array [0..35] of Real;
RAB3 :Array [0..2] of Real;
RAB4 :Array [0..3] of Real;
begin
for _i:=0 to 1 do //обнуление рабочего массива
RAB[_i] := 0.0;
for _i:=0 to 32 do //обнуление рабочего массива
RAB1[_i] := 0.0;
for _i:=0 to 35 do //обнуление рабочего массива
RAB2[_i] := 0.0;
for _i:=0 to 2 do //обнуление рабочего массива
begin
A[_i] := 0.0;
B[_i] := 0.0;
AL[_i] := 0.0;
BE[_i] := 0.0;
RAB3[_i] := 0.0;
end;
for _i:=0 to 3 do //обнуление рабочего массива
RAB4[_i] := 0.0;
Result := ''; { результат функции }
IP := 2;
IQ := 2;
U := -1.0;
V := 1.0;
II20R(IP,IQ,U,V,FII20R,A,B,AL,BE,RAB,RAB1,
RAB2,RAB3,RAB4,IERR);
Result := Result + Format(' %10d %10d %20.16f %20.16f %10d ',
[IP,IQ,U,V,IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
begin
Result := Result + Format('%20.16f ',[A[_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 2 do
begin
Result := Result + Format('%20.16f ',[B[_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 2 do
begin
Result := Result + Format('%20.16f ',[AL[_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 2 do
begin
Result := Result + Format('%20.16f ',[BE[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for K:=1 to 4 do
begin
Result := Result + Format('%20.16f ',[RAB2[(K-1)+0]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TII20R',Result); { вывод результатов в файл TII20R.res }
exit;
end;
end.
Результаты:
A = (1., .480197, .0392021) ;
B = (1., -.480197, .0392021) ;
AL = (1., .499789, .0816032) ;
BE = (1., -.499789, .0816032) ;
IERR = 0
RAB2 (1, 1) = .00024 ; RAB2 (2, 1) = .000089 ;
RAB2 (3, 1) = 7.3884 ; RAB2 (4, 1) = 1.05524