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

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

Назначение

Наилучшая среднеквадратическая аппроксимация дискретными унимодальными функциями.

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

Для заданной дискретной фyнkции  F = ( f 1, f 2, ..., f N ) вычисляется наилучшее среднеквадратическое приближение  T = ( t 1, t 2, ..., t N ) на классе дискретных функций, имеющих один экстремум. Приближение  T вычисляется из условия:

    N
    ∑   p K ( f K - t K )2  =
   K=1
                                                                                 N
                        =         min                 min                ∑        pK ( f K  - y K )2 ,
                             K1 ≤ L ≤ K2      YS( M, L )        K=1 

где  K1, K2 - предполагаемые границы расположения искомого экстремума,  p K > 0,  K = 1, 2, ..., N - заданные весовые коэффициенты, класс

   S (M, L) = { Y  RN :  sign(M) ( yK + 1 - yK ) ≥ 0 ,    K = 1, 2, ..., L - 1 ,
                        sign(M) ( yK + 1 - yK ) ≤ 0 ,    K = L, ..., N - 1 } , 

а заданный параметр  M определяет вид экстремума: при  M > 0 приближение  T ищется на множестве функций, имеющих один максимум, а при  M < 0 - один минимум. Если  M = 0, то функция  Т полагается равной исходной функции  F .

М.К.Самарин. Приближение сеточных функций функциями с заданным числом внутренних экстремумов, Сб. "Численный анализ на ФОРТРАНе", вып. 7, 1974, 101 - 110.

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

    int ia03r_c (real *f, real *t, real *p, integer *m, integer *n,
             integer *k1, integer *k2, integer *ierr)

Параметры

f - вещественный вектоp длины  n заданных значений приближаемой функции;
t - вещественный вектоp длины  n вычисленных значений найденного приближения;
p - вещественный вектоp длины  n заданных весовых коэффициентов;
m - заданный параметр, определяющий класс, приближающих функций (тип: целый):
m > 0 - приближение ищется на множестве функций, имеющих один максимум;
m < 0 - приближение ищется на множестве функций имеюших один минимум;
m = 0 - приближение полагается равным исходной функции;
n - заданное число значений функции  F (тип: целый);
k1, k2 - заданные нижняя и верхняя границы номеpов узлов, между которыми заключен экстремум искомого приближения  1 ≤ k1 ≤ k2 ≤ n (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - если экстремум искомого приближения находится вне заданных границ; в этом случае приближение полагается равным исходной функции.

Версии: нет

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

ia02r_c - наилучшая среднеквадратическая аппроксимация дискретными монотонными функциями;
utia10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы ia03r_c.

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

  Алгоритм вычисляет искомое приближение за  o ( ( k2 - k1 ) n 2 ) арифметических операций, поэтому в целях сокращения времени счета рекомендуется более точно указывать границы  k1 и  k2, между которыми заключен экстремум искомой функции.

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

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

    /* Local variables */
    extern int ia03r_c(float *, float *, float *, int *,
                       int *, int *, int *, int *);
    static int i__, m, n, i;
    static float t[5];
    static int k1, k2;

    n = 5;
    m = 1;
    k1 = 1;
    k2 = n;
    ia03r_c(f, t, p, &m, &n, &k1, &k2, &i__);

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


Результаты:  ierr = 0 ;    t = (1., 1., 1., 9., 4.)