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

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

Назначение

Решение задачи безусловной минимизации функции многих переменных по заданному направлению (задача одномерной минимизации) методом квадратичной аппроксимации.

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

Для решения задачи:

 min  f(x0 + λ s0) ,   -∞ < λ < ∞ ,   x0En ,   s0En ,
   λ 

x0 и  s0 заданы, используется метод квадратичной аппроксимации Пауэлла.

Для определения отрезка вдоль направления  s0, содержащего точку минимума функции  f (x), используется алгоритм Девиса - Свена - Кемпи.

Минимум  f (x) по направлению  s0 считается найденным, если выполнено хотя бы одно из следующих условий:

1.  min | xi - xi | ≤ XLIM ,
  i
где  xi = x0 + λi s0 - три точки ( i = 1, 2, 3), по которым строится аппpоксимиpующая парабола,  x = x0 + λ s0 - точка минимума параболы, а  XLIM - заданная точность решения задачи по аpгументу;
2.  | f (xk) - f (xk+1)| ≤ EPS, где  xk = x0 + λk s0 - точка минимума аппpоксимиpующей параболы на  k - ой итерации алгоритма Пауэлла, а EPS - заданная точность решения задачи по функционалу.

Д.Химмельблау, Прикладное нелинейное программирование. Изд - во "Мир", M., 1975, 54 - 55.

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

    int mnb5r_c (integer *n, real *x, real *s, real *xx,
            real *delx, real *eps, real *xlim, real *xmin, real *ymin,
            integer *kount, integer *ier, S_fp fun)

Параметры

n - размерность пространства переменных (тип: целый);
x - вещественный вектоp длины  n, задающий начальную точку  x0 поиска минимума  f (x) по направлению;
s - вещественный вектоp длины  n, задающий направление  s0 одномерной минимизации;
xx - вещественный вектоp длины  n, используемый в подпрограмме как рабочий;
delx - заданный начальный шаг одномерного поиска (тип: вещественный);
eps - заданная точность вычисления одномерного минимума по функционалу (тип: вещественный);
xlim - заданная точность вычисления одномерного минимума по аpгументу (тип: вещественный);
xmin - вещественная переменная, содержащая расстояние до точки минимума  f (x) вдоль  s0, т.е.  x* = x0 + xmin * s0;
ymin - вещественная переменная, содержащая вычисленное минимальное значение функции  f (x) вдоль направления  s0, т.е.  ymin = f (x*);
kount - целая переменная, содержащая фактически выполненное число вычислений функции  f (x) в процессе одномерной минимизации;
ierr - целочисленная переменная, указывающая пpичину окончания процесса:
ierr= 0 - найден минимум с заданной точностью;
ierr= 1 - установлено, что минимум  f (x) вдоль направления  s0 из заданной точки  x0 не существует;
fun - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию).

Версии: нет

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

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

 

Подпрограмма fun составляется пользователем.

Первый оператор подпрограммы вычисления функции должен иметь вид:

            int fun(float *x, float *f, float *fe)

        Параметры     
        x  - вещественный вектор длины  n, задающий точку
               пространства, в которой  вычисляется значение функции;
        f  - вещественная переменная, содержащая
               вычисленное значение функции в точке  x;
       fe - заданная точность вычисления значения функции
               в точке  x (тип: вещественный). 

Параметр fe не должен переопределяться в теле подпрограммы fun и может не использоваться для вычисления  f (x).

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

    min  f(x) ,    x  E1 ,   x0 = 0.0 ,   s0 = 1.0 ,   f(x) = 100 * e-x + x .

    Точка минимума  f(x)  вдоль  s  pавна  
          xk = - ln (0.01) ,   f(xk) = i - ln (0.01)

int main(void)
{
    /* Initialized data */
    static int n = 1;
    static float xlim = 1e-6f;
    static float delx = .5f;
    static float eps = 1e-7f;

    /* Builtin functions */
    double exp(double);

    /* Local variables */
    extern int func_c();
    static float xmin, ymin;
    extern int mnb5r_c(int *, float *, float *, float *, float *, float *,
                       float *, float *, float *, int *, int *, U_fp);
    static float r__, s[1], x[1];
    static int kount;
    static float xx[1];
    static int ier;

    x[0] = 0.f;
    s[0] = 1.f;
    mnb5r_c(&n, x, s, xx, &delx, &eps, &xlim, &xmin, &ymin, &kount, &ier,
            (U_fp)func_c);

    printf("\n %5i \n", ier);
    printf("\n %5i \n", kount);
    printf("\n %16.7e \n", xmin);
    printf("\n %16.7e \n", ymin);
    r__ = (float)exp((float)(-xmin)) * -100.f + 1.f;
    printf("\n %16.7e \n", r__);
    return 0;
} /* main */

int func_c(float *x, float *f, float *fe)
{
    /* Builtin functions */
    double exp(double);

    /* Parameter adjustments */
    --x;

    /* Function Body */
    *f = (float)exp((float)(-x[1])) * 100.f + x[1];
    return 0;
} /* func_c */


Результаты:

      ierr  =  0
      kount  =  15

      xmin  =  4.6057000 + 00
      ymin  =  5.6051700 + 00