Документ взят из кэша поисковой машины. Адрес оригинального документа : http://num-anal.srcc.msu.ru/lib_na/cat/i_htm_c/iam1r_c.htm
Дата изменения: Fri May 22 13:47:56 2015
Дата индексирования: Sun Apr 10 01:48:10 2016
Кодировка: Windows-1251
БЧА НИВЦ МГУ. IAM1R_C. Аппроксимация произвольными функциями
Текст подпрограммы и версий
iam1r_c.zip , iam1d_c.zip
Тексты тестовых примеров
tiam1r_c.zip , tiam1d_c.zip

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

Назначение

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

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

Пусть задана кусочно - постоянная функция  f0 (x),  x  (x0, xN]:

                       f0 (x)  =  y1 ,    x  ( x i -1, x1 ] ,    i = 1,..., N 

Строится наилучшая среднеквадратическая аппроксимация функции  f0 (x) в классе монотонно возрастающих функций:

                  xN
                   ∫  [ f(x) - f0(x) ]2  dx  =  min ,     f(x)  V1 [x0, xN] ,
                 x0 

где V1 [x0, xN] - множество монотонно возрастающих функций. В подпрограмме реализован прямой метод решения этой задачи, разработанный в [1] и требующий CONST*N арифметических операций. Алгоритм основан на построении выпуклой оболочки функции

                               x
               F0 (x)  =  ∫  f(t) dt
                             x0
и последующем ее дифференцировании. 

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

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

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

    int iam1r_c (integer *n, real *x0, real *x, real *y, real *z,
             integer *ii, real *f0)

Параметры

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

Версии

iam1d_c - среднеквадратическая аппроксимация кусочно - постоянной функции монотонной кусочно - постоянной функцией в режиме удвоенной точности. При этом параметры x0, x, y, z, f0 должны иметь тип double.

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

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

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

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

                f0 (x)  =  y1 ,   x  ( x i -1, x1 ] ,    i = 1, ..., 7
такой, что
                x0  =  0.
                x   =  ( 2., 4., 5., 7., 10., 12., 15. )
                y   =  ( 1., -1., -2., 2., -0.333333, 3., 1. )

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

int main(void)
{
    /* Initialized data */
    static float x[7] = { 2.f,4.f,5.f,7.f,10.f,12.f,15.f };
    static float y[7] = { 1.f,-1.f,-2.f,2.f,-.333333f,3.f,1.f };

    /* Local variables */
    extern int iam1r_c(int *, float *, float *, float *, float *, int *,
                       float *);
    static int i__[7], j, n;
    static float z__[7], f0[7], x0;
    static int ii[7];
    int i__1;

    n = 7;
    x0 = 0.f;
    iam1r_c(&n, &x0, x, y, z__, ii, f0);
    i__1 = n;
    for (j = 1; j <= i__1; ++j) {
/* l1: */
        i__[j - 1] = j;
    }
    printf("\n i__ = %9i %9i %9i %9i %9i %9i %9i \n",
               i__[0],i__[1],i__[2],i__[3],i__[4],i__[5],i__[6]);
    printf("\n  x = %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e \n",
                x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]);
    printf("\n  y = %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e \n",
                y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7]);
    printf("\n  z__ = %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e \n",
             z__[0], z__[1], z__[2], z__[3], z__[4], z__[5], z__[6], z__[7]);
    printf("\n ii = %5i %5i %5i %5i %5i %5i %5i \n",
              ii[0], ii[1], ii[2], ii[3], ii[4], ii[5], ii[6]);
    return 0;
} /* main */


Результат:   z__  =  ( -0.4, -0.4, -0.4, 0.6, 0.6, 1.8, 1.8 )