Текст подпрограммы и версий
ii20r_p.zip
Тексты тестовых примеров
tii20r_p.zip

Подпрограмма:  II20R (модуль II20R_p)

Назначение

Дробно - рациональная интерполяция функции, заданной на конечном интервале.

Математическое описание

Пусть на интервале  [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