Текст подпрограммы и версий
ii23r_p.zip , ii23e_p.zip
Тексты тестовых примеров
tii23r_p.zip , tii23e_p.zip

Подпрограмма:  II23R (модуль II23R_p)

Назначение

Рациональная интерполяция таблично - заданной функции с помощью непрерывных дробей.

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

Пусть заданы m точек x1 < x2 < x3 < ... < xm , в которых известны значения функции  y = f (x) : y1, y2, y3,..., ym. Подпрограмма II23R по заданным ( xi, yi ), i = 1, 2,..., m, строит интерполирующую непрерывную дробь

a1   +   ( x - x1 ) / ( a2 + ( x - x2 ) / ( a3 + ... + ( x - xm-1 ) / am ) ... )

Кроме того, подпрограмма II23R приводит вычисленную непрерывную дробь к рациональной функции

( b0  +  b1 x  +  ...  +  bn xn ) / ( c0  +  c1 x  +  ...  +  cn xn )     ,

где  n ≤ m ÷ 2 . Здесь   ÷  - означает целое деление.

Использование

procedure II23R(M :Integer; var X :Array of Real;
                var Y :Array of Real; var A :Array of Real;
                var B :Array of Real; var C :Array of Real;
                var P :Array of Real; var Q :Array of Real);

Параметры

M - заданное число точек  xi , i = 1, 2,..., m (тип: целый);
X - вещественный вектор длины M, содержащий заданные точки  xi , i = 1, 2,..., m;
Y - вещественный вектор длины M, содержащий значения заданной функции в точках  xi , i = 1, 2,..., m;
A - вещественный вектор длины M, содержащий вычисленные значения коэффициентов интерполирующей непрерывной дроби;
B, C - вещественные векторы длины M ÷ 2 + 1, содержащие коэффициенты полиномов соответственно в числителе и знаменателе интерполирующей рациональной функции;
P, Q - вещественные векторы длины M ÷ 2 + 1, используемые в подпрограмме в качестве рабочих.

Версии

II23E - рациональная интерполяция таблично - заданной функции с помощью непрерывных дробей в режиме расширенной (Extended) точности; при этом параметры X, Y, A, B, C, P и Q должны иметь тип Extended.

Вызываемые подпрограммы: нет

Замечания по использованию: нет

Пример использования

Unit tii23r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, II23R_p;

function tii23r: String;

implementation

function tii23r: String;
var
M,_i :Integer;
X :Array [0..4] of Real;
Y :Array [0..4] of Real;
A :Array [0..4] of Real;
B :Array [0..2] of Real;
C :Array [0..2] of Real;
P :Array [0..2] of Real;
Q :Array [0..2] of Real;
begin
Result := '';  { результат функции }
X[0] := 50.0;
X[1] := 65.0;
X[2] := 60.0;
X[3] := 95.0;
X[4] := 75.0;
Y[0] := -40.0;
Y[1] := 25.0;
Y[2] := 10.0;
Y[3] := 30.0;
Y[4] := -20.0;
M := 5;
II23R(M,X,Y,A,B,C,P,Q);
Result := Result + #$0D#$0A;
for _i:=0 to 4 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 ',[C[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tii23r',Result);  { вывод результатов в файл tii23r.res }
exit;
end;

end.


Результаты:  

       A  =  ( -40,  0.2307692,  162.5,  -0.3901895,  -68.50479 );
       B  =  ( 236142.4,  -7220.216,  53.99522 );
       C  =  ( 2825.957,  -111.5789,  1 )