Текст подпрограммы и версий
iam2r_c.zip , iam2d_c.zip
Тексты тестовых примеров
tiam2r_c.zip , tiam2d_c.zip

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

Назначение

Среднеквадратическая аппроксимация кусочно - линейной функции выпуклой кусочно - линейной функцией.

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

Пусть задана кусочно - постоянная функция  f0 (x),  x  [x1, xN], имеющая узловые точки  x1, ..., xN и узловые значения  y1, ..., yN:

   f0(x)  =  (yi+1 - y1) x / (xi+1 - x1)  +  (y1xi+1 - yi+1x1) / (xi+1 - x1) ,

           x  [x1,xi+1] ,   i = 1, ..., N-1  

Строится среднеквадратическая аппроксимация функции  f0 (x) в классе выпуклых функций по методу, разработанному в [1].

Основной процедурой в этом методе является построение интерполяционного кубического сплайна с нулевыми краевыми условиями.

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

1.  Малышев В.А. Среднеквадратическая аппроксимация выпуклыми функциями. Сб."Численный анализ: методы, алгоритмы, приложения". Изд - во МГУ, 1985.

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

    int iam2r_c (integer *n, real *x, real *y, real *z,
            integer *ii, real *f0, real *f, real *a, real *b, real *c,
            real *h, real *v)

Параметры

n - заданное число узловых точек аппроксимируемой кусочно - линейной функции (тип: целый);
x - вещественный вектор длины n заданных значений узловых точек;
y - вещественный вектор длины n заданных значений аппроксимируемой кусочно - линейной функции;
z - вещественный вектор длины n вычисленных в точках  x1, ..., xn значений аппроксимирующей кусочно - линейной функции;
i i - целый вектор длины n, содержащий полученные номера  i1, ...,ik (k ≤ n) узловых точек  xi 1, ..., xi k аппроксимирующей кусочно - линейной функции;
f0, f, -
a, b, c,  
h, v  
вещественные рабочие векторы длины n;

Версии

iam2d_c - среднеквадратическая аппроксимация кусочно - линейной функции выпуклой кусочно - линейной функцией в режиме удвоенной точности. При этом параметры x, y, z, f0, f, a, b, c, h и v должны иметь тип double.

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

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

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

Для среднеквадратической аппроксимации кусочно - линейной функции

   f0(x)  =  (yi+1 - y1) x / (xi+1 - x1)  +  (y1xi+1 - yi+1x1) / (xi+1 - x1) ,

           x  [x1,xi+1] ,   i = 1, ..., 10

 такой, что
          x  =  ( 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10. )
          y  =  ( 8., 5., 6., 4., 3., 4., 5., 4., 7., 9., 8. )

 Обращение к подпрограмме имеет вид:

int main(void)
{
    /* Initialized data */
    static float x[11] = { 0.f,1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f,9.f,10.f };
    static float y[11] = { 8.f,5.f,6.f,4.f,3.f,4.f,5.f,4.f,7.f,9.f,8.f };

    /* Local variables */
    extern int iam2r_c(int *, float *, float *, float *, int *, float *,
                       float *, float *, float *, float *, float *, float *);
    static float a[11], b[11], c__[11], f[11], h__[11];
    static int i__[11], j, n, i;
    static float v[11], z__[11], f0[11];
    static int ii[11];
    int i__1;

    n = 11;
    iam2r_c(&n, x, y, z__, ii, f0, f, a, b, c__, h__, v);

    i__1 = n;
    for (j = 1; j <= i__1; ++j) {
/* l1: */
        i__[j - 1] = j;
    }
    for (i = 0; i <= 5; i+= 5) {
        printf("\n %9.2e %9.2e %9.2e %9.2e %9.2e ",
                    x[i], x[i+1], x[i+2], x[i+3], x[i+4]);
    }
    printf("\n %9.2e \n", x[10]);
    for (i = 0; i <= 5; i+= 5) {
        printf("\n %9.2e %9.2e %9.2e %9.2e %9.2e ",
                    y[i], y[i+1], y[i+2], y[i+3], y[i+4]);
    }
    printf("\n %9.2e \n", y[10]);

    for (i = 0; i <= 5; i+= 5) {
      printf("\n %9.2e %9.2e %9.2e %9.2e %9.2e ",
              z__[i], z__[i+1], z__[i+2], z__[i+3], z__[i+4]);
    }
    printf("\n %9.2e \n", z__[10]);
    printf("\n %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i \n",
               ii[0],ii[1],ii[2],ii[3],ii[4],ii[5],ii[6],
               ii[7],ii[8],ii[9],ii[10]);
    return 0;
} /* main */


Результат: 

       z__  =  ( 7.59, 5.83, 5.01, 4.19, 3.38, 3.92, 4.46, 5.00, 6.54, 8.07, 9.61 )