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

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

Назначение

Минимизация функции многих переменных по заданному направлению на заданном отрезке методом Фибоначчи.

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

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

     min  φ (x0 + λ s) ,   a0 ≤ λ ≤ b0 ,
       λ 

где  x0, s  En,   a0, b0, λ  E1, используется метод Фибоначчи.

Функция  φ предполагается строго квазивыпуклой на отрезке [a0, b0] по направлению  s.

Hа  k - ой итерации метода строится отрезок  [ak, bk] такой, что  [ak, bk [ak - 1, bk - 1 ...  [a0, b0], и значение  λ*k  [ai, bi] для всех  i, где  λ*k - искомая точка минимума  φ (x) по направлению  s.

Значение  λ*k считается найденым, если для некоторого  k выполнено одно из следующих условий:

- длина отрезка  [ak, bk] меньше заданного  ε > 0;

- | φ (x0 + α s) - φ (x0 + β s) | < ε1 max {| φ (x0 + α s)|, | φ (x0 + β s)|},
   где  ak < α < β < bk;

- выполнено максимальное число итераций метода;

- выполнено максимальное число вычислений функции.

В.Г.Карманов. Математическое программирование. M., Изд - во "Наука", 1980.

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

    int mnl1r_c (integer *n, real *x, real *xmin, real *s,
        S_fp fun, real *aa, real *bb, real *xe, real *fe, real *up,
            real *rm, integer *ierr)

Параметры

n - размерность пространства переменных (тип: целый);
x - вещественный вектоp длины  n, задающий начальную точку поиска минимума по направлению;
xmin - вещественная переменная, содержащая на выходе шаг по направлению до вычисленной точки минимума;
s - вещественный вектоp длины  n, задающий направление одномерной минимизации;
fun - имя подпрограммы вычисления значения функции (см. замечания по использованию);
aa - вещественная переменная, задающая нижнюю гpаницу исходного отрезка неопределенности;
bb - вещественная переменная, задающая верхнюю границу исходного отрезка неопределенности;
xe - заданная точность  ε вычисления точки минимума по аpгументу - длина конечного отрезка неопределенности (тип: вещественный);
fe - заданная точность  ε1 вычисления точки минимума по функционалу (тип: вещественный);
up - вещественный вектоp длины 3, содержащий упpавляющие параметры алгоритма (см. замечания по использованию);
rm - вещественный вектоp длины  n, используемый в подпрограмме как рабочий;
ierr - целая переменная, указывающая пpичину окончания процесса:
ierr= 1 - если достигнута точность xe;
ierr= 2 - если достигнута точность fe;
ierr= 4 - если выполнено максимальное число итераций;
ierr= 5 - если выполнено максимальное число вычислений функции;
ierr=65 - если xe ≤ 0;
ierr=66 - если (bb - aa) < 0 или xe > (bb - aa).

Версии: нет

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

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

 

Подпрограмма fun составляется пользователем. Первый оператор подпрограммы должен иметь вид:

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

       Параметры
       x   - точка, в которой вычисляется значение функции;
       f   - вычисленное значение функции;
       fe - точность, с которой вычисляется значение  f. 

Имя подпрограммы вычисления функции должно быть определено в вызывающей программе в операторе extern.

Вектоp up должен быть задан следующим образом:

up (1) - максимальное допустимое число итераций метода;

up (2) - максимальное допустимое число вычислений функции;

up (3) - определяет вариант алгоритма, т.е. если up (3) = 1, то на каждой итерации вычисляется только одна контрольная точка, если up (3) = 2, то вычисляются обе точки.

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

    min  φ (x) ,   4.2 ≤ x ≤ 4.8
    φ (x)  =  100 e -x + x ,    x*  =  - ln(0.01)

int main(void)
{
    /* Initialized data */
    static int n = 1;
    static float x[1] = { 0.f };
    static float s[1] = { 1.f };
    static float aa = 4.2f;
    static float bb = 4.8f;
    static float fe = 1e-16f;
    static float xe = 1e-6f;
    static float up[3] = { 100.f,100.f,1.f };

    /* Local variables */
    extern int func_c();
    static int ierr;
    static float xmin;
    extern int mnl1r_c(int *, float *, float *, float *, U_fp, float *,
                       float *, float *, float *, float *, float *, int *);
    static float rm[1];

    printf("\n %16.7e \n", aa);
    printf("\n %16.7e \n", bb);
    printf("\n %16.7e \n", fe);
    printf("\n %16.7e \n", xe);
    mnl1r_c(&n, x, &xmin, s, (U_fp)func_c, &aa, &bb, &xe, &fe, up, rm, &ierr);

    printf("\n\n %5i \n", ierr);
    printf("\n %16.7e \n", xmin);
    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  =  2
      xmin  =  4.60517176