Текст подпрограммы и версий
ii23r_c.zip , ii23d_c.zip
Тексты тестовых примеров
tii23r_c.zip , tii23d_c.zip

Подпрограмма:  ii23r_c

Назначение

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

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

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

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

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

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

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

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

    int ii23r_c (integer *m, real *x, real *y, real *a, real *b,
            real *c, real *p, real *q)

Параметры

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, используемые в подпрограмме в качестве рабочих.

Версии

ii23d_c - рациональная интерполяция таблично - заданной функции с помощью непрерывных дробей в режиме удвоенной точности; при этом параметры x, y, a, b, c, p и q должны иметь тип double.

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

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

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

int main(void)
{
    /* Local variables */
    extern int ii23r_c(int *, float *, float *, float *, float *,
                       float *, float *, float *);
    static float a[5], b[3], c__[3];
    static int m;
    static float p[3], q[3], x[5], y[5];

    x[0] = 50.f;
    x[1] = 65.f;
    x[2] = 60.f;
    x[3] = 95.f;
    x[4] = 75.f;
    y[0] = -40.f;
    y[1] = 25.f;
    y[2] = 10.f;
    y[3] = 30.f;
    y[4] = -20.f;
    m = 5;
    ii23r_c(&m, x, y, a, b, c__, p, q);

    printf("\n %15.7e%15.7e%15.7e%15.7e%15.7e \n",
           a[0], a[1], a[2], a[3], a[4]);
    printf("\n %15.7e %15.7e %15.7e \n", b[0], b[1], b[2]);
    printf("\n %15.7e %15.7e %15.7e \n", c__[0], c__[1], c__[2]);
    return 0;
} /* main */


Результаты:  

       a    =  ( -40,  0.2307692,  162.5,  -0.3901895,  -68.50479 );
       b    =  ( 236142.4,  -7220.216,  53.99522 );
       c__  =  ( 2825.957,  -111.5789,  1 )