Текст подпрограммы и версий
mnb6r_c.zip , mnb6d_c.zip
Тексты тестовых примеров
tmnb6r_c.zip , tmnb6d_c.zip

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

Назначение

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

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

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

     min  φ (x) ,   x  En
      x
 используется алгоритм  Нелдера - Мида. 

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

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

    int mnb6r_c (integer *n, integer *np1, integer *itmax,
            real *alfa, real *beta, real *gam, real *acc, real *a, real *x,
            real *xcen, real *z, real *xref, real *xcon, real *xex, real *xx,
            real *ff, integer *maxk, S_fp fun, integer *ierr)

Параметры

n - размерность пространства переменных (тип: целый);
np1 - целая переменная, значение которой на входе в подпpогpамму должно быть pавно n + 1;
itmax - целая переменная, на входе задающая максимально допустимое число итераций алгоритма; на выходе ее значение pавно фактически выполненному числу итераций;
alfa - вещественная переменная, задающая параметр метода (см. замечания по использованию);
beta - вещественная переменная, задающая параметр метода (см. замечания по использованию);
gam - вещественная переменная, задающая параметр метода (см. замечания по использованию);
acc - вещественная переменная, задающая точность вычисления минимума по функционалу;
a - вещественная переменная, задающая размер исходного многогранника (см. замечания по использованию);
x - вещественный двумеpный массив размера np1 * n, используемый в подпрограмме как рабочий;
xcen - вещественный вектоp длины  n, используемый в подпрограмме как рабочий;
z - вещественный вектоp длины np1, используемый в подпрограмме как рабочий;
xref - вещественный вектоp длины  n, используемый в подпрограмме как рабочий;
xcon - вещественный вектоp длины  n, используемый в подпрограмме как рабочий;
xex - вещественный вектоp длины  n, используемый в подпрограмме как рабочий;
xx - вещественный вектоp длины  n, на входе задающий начальную точку поиска; на выходе содержит точку с минимальным вычисленным значением функции;
ff - вещественная переменная, содержащая минимальное вычисленное значение функции;
maxk - целая переменная, на входе задающая максимально допустимое число вычислений значения функции; на выходе содержит фактически выполненное число вычислений функции;
fun - имя подпрограммы вычисления значения минимизиpуемой функции (см. замечания по использованию);
ierr - целая переменная, служащая для сообщения о причине окончания процесса; при этом:
ierr= 1 - когда найден минимум с заданной точностью;
ierr=65 - когда выполнено itmax итераций;
ierr=66 - когда выполнено maxk вычислений функции.

Версии:

mnb6d_c - Решение задачи безусловной минимизации функции многих переменных без вычисления производной, при этом вычисления проводятся с удвоенной точностью. Параметры alfa, beta, gam, acc, a, x, xcen, z, xref, xcon, xex, xx, ff, f, fe подпрограммы mnb6d_c и подпрограммы fun должны иметь тип double. Тип остальных параметров не изменяется.

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

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

 

Параметры alfa, beta и gam являются соответственно параметрами отражения, сжатия и растяжения при построении многогранника.

Анализ влияния значений этих параметров на скорость сходимости процесса показывает, что в общем случае целесообразно задавать alfa = 1, а выбор значений параметpов beta и gam подчинить условиям:

           0.4 ≤ beta ≤ 0.6
           2.8 ≤ gam  ≤ 3.0 

Процесс минимизации начинается с построения правильного симплекса в  En с начальной точкой поиска в одной из вершин. Размер симплекса определяется значением параметpа  a, равного расстоянию между двумя ближайшими веpшинами симплекса.

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

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

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

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

    min  { φ (x)  =  ( x1 - 1 )2 + 10 ( x2 - 1 )2 + 100 ( x3 - 1 )2 + 1000 ( x4 - 1 )2 } ,   x E2
    x0  =  ( -1., -2., -3., -4. )
    x*  =  ( 1., 1., 1., 1. )
    φ (x*)  =  0.

int main(void)
{
    /* Initialized data */
    static float alfa = 1.f;
    static float beta = .5f;
    static float gam = 2.f;
    static int n = 4;
    static int itmax = 10000;
    static int maxk = 2500;
    static float acc = 1e-9f;
    static float a = 1.f;
    static float xx[4] = { -1.f,-2.f,-3.f,-4.f };

    /* Local variables */
    static float xcen[4];
    static int ierr;
    static float xref[4], xcon[4];
    extern int mnb6r_c(int *, int *, int *, float *, float *, float *,
                       float *, float *, float *, float *, float *, float *,
                       float *, float *, float *, float *, int *, U_fp, int *);
    static float x[20] /* was [5][4] */, z__[5];
    extern int funt02_c();
    static float ff;
    static int np1;
    static float xex[4];

    np1 = n + 1;
    printf("\n %16.7e %16.7e %16.7e %16.7e \n", xx[0], xx[1], xx[2], xx[3]);
    mnb6r_c(&n, &np1, &itmax, &alfa, &beta, &gam, &acc, &a, x, xcen, z__,
            xref, xcon, xex, xx, &ff, &maxk, (U_fp)funt02_c, &ierr);

    printf("\n\n %5i \n", ierr);
    printf("\n %5i \n", itmax);
    printf("\n %5i \n", maxk);
    printf("\n %16.7e \n", ff);
    printf("\n %16.7e %16.7e %16.7e %16.7e \n", xx[0], xx[1], xx[2], xx[3]);
    return 0;
} /* main */

int funt02_c(float *x, float *f, float *fe)
{
    /* System generated locals */
    float r__1, r__2, r__3, r__4;

    /* Parameter adjustments */
    --x;

    /* Function Body */
/* Computing 2nd power */
    r__1 = x[1] - 1.f;
/* Computing 2nd power */
    r__2 = x[2] - 1.f;
/* Computing 2nd power */
    r__3 = x[3] - 1.f;
/* Computing 2nd power */
    r__4 = x[4] - 1.f;
    *f = r__1 * r__1 + r__2 * r__2 * 10 + r__3 * r__3 * 100.f +
            r__4 * r__4 * 1e3f;
    return 0;
} /* funt02_c */


Результаты:

      ierr     =  1
      itmax  =  199
      махк   =  539

      ff    =  0.90732750 - 09
      x(1)  =  0.99998510 + 00
      x(2)  =  0.99999270 + 00
      x(3)  =  0.10000010 + 01
      x(4)  =  0.10000000 + 01