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

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

Назначение

Построение наилучшего среднеквадратического приближения одномерной дискретной функции на множестве кусочно - монотонных функций.

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

Пусть задана дискретная фунkция  F = (f1, f2, ..., fN). Отыскивается дискретная функция  T = (t1, t2, ..., tN), для которой

       N                                               
       ∑   pk*( tk - fk )2  =   
      k=1                                                                                                                       
                                            N
                             =   inf      ∑    pk*( yk - fk )2  ,
                                YV    k=1 

где P = (p1, p2, ..., pN) - положительная весовая функция, V - множество дискретных функций  Y = (y1, y2, ..., yN) удовлетворяющих условиям кусочной монотонности:

     mk ( yk+1 - yk ) ≥ 0 ,     k = 1, 2, ..., N-1 

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

B подпрограмме реализован прямой метод решения задачи, требующий не более 3N2 арифметических операций.

Самарин M.K. Среднеквадратическая аппроксимация кусочно - монотонными функциями, Сб. "Численный анализ на ФОРТРАНе", вып.15, Изд-во МГУ, 1976.

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

    int ia01r_c (real *f, real *t, real *p, integer *m, integer *n)

Параметры

f - вектоp значений заданной дискретной функции (тип: вещественный);
t - вектоp значений искомой функции (тип: вещественный);
p - вектоp весовых коэффициентов (тип: вещественный);
m - вектоp размерности n, в первых n - 1 компонентах которого заданы параметры mk, определяющие условия кусочной монотонности, а последняя компонента является рабочей (тип: целый);
n - размерность вещественных вектоpов f, t и p.

Версии: нет

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

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

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

Для приближения дискретной функции F = (0., 2., - 5., 1., - 1.) при весовых коэффициентах, равных единице, на множестве Y, удовлетворяющих условиям

         yk+1 - yk ≥ 0 ,      k = 1, 2, 3, 4  , 

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

int main(void)
{
    /* Initialized data */
    static float f[5] = { 0.f,2.f,-5.f,1.f,-1.f };
    static float p[5] = { 1.f,1.f,1.f,1.f,1.f };
    static int m[5] = { 1,1,1,1,0 };

    /* Local variables */
    extern int ia01r_c(float *, float *, float *, int *, int *);
    static int n, i;
    static float t[5];

    n = 5;
    ia01r_c(f, t, p, m, &n);

    for (i = 1; i <= 5; ++i) {
        printf("\n %16.7e \n",t[i-1]);
    }
    return 0;
} /* main */


Результат:

       t  =  (-1., -1., -1., 0., 0.)