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

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

Назначение

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

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

Для решения задачи:  min  f (x),  x  En используется метод прямого поиска (т.е. без вычисления производной) Розенброка.

Некоторая вычисленная точка  xk  En считается точкой минимума  f (x), если  | f (xk) - f (xk - 1)| ≤ EPSY, где  k - номеp этапа поиска, а  EPSY - заданная точность вычисления минимума по функционалу.

Для пересчета ортонормированной системы направлений поиска используется пpоцедуpа Грама - Шмидта.

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

Р.Беллман, Введение в теорию матриц, Изд - во "Hаука", M., 1976 , 65 - 67.

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

    int mnb1r_c (integer *n, real *x, real *f, real *eps,
            integer *maxk, integer *mkat, integer *mcyc, real *alpha, real *beta,
            integer *nstep, real *epsy, real *x1, real *v, real *bl, real *al,
            real *d, real *blen, real *aj, real *e, S_fp fun, integer *ierr)

Параметры

n - размерность пространства переменных (тип: целый);
x - вещественный вектоp длины  n; при обращении к подпрограмме содержит заданную начальную точку поиска; на выходе - содержит точку минимального вычисленного значения  f (x);
f - вещественная переменная, содержащая вычисленное минимальное значение функции  f (x);
eps - вещественный вектоp длины  n, содержащий заданные начальные значения шага при поиске по ортогональным направлениям;
maxk - целая переменная, при обращении к подпрограмме содержащая заданное максимальное допустимое число вычислений функции, а на выходе - выполненное число вычислений функции;
mkat - целая переменная, при обращении к подпрограмме содержащая заданное максимально допустимое число этапов метода, а на выходе - выполненное число этапов;
mcyc - заданное максимально допустимое число циклов на одном этапе метода (тип: целый);
alpha - вещественная переменная, содержащая заданное значение параметра метода (см. замечания по использованию);
beta - вещественная переменная, содержащая заданное значение параметра метода (см. замечания по использованию);
nstep - заданный признак обновления длины шага по ортогональным направлениям (если  nstep = 1, то каждый новый этап начинается с шага eps) (тип: целый);
epsy - заданная точность вычисления минимума по функционалу (тип: вещественный);
x1, d, -
aj, e,  
blen  
вещественные векторы длины  n, используемые в подпрограмме как рабочие;
v, bl -
al  
вещественные двумеpные массивы размерности  n * n, используемые в подпрограмме как рабочие;
fun - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию);
ierr - целая переменная, указывающая пpичину окончания процесса:
ierr= 0 - найден минимум с заданной точностью по функционалу;
ierr=66 - выполнено максимальное число вычислений функции;
ierr=67 - выполнено максимальное число циклов на одном этапе метода;
ierr=68 - выполнено максимальное число этапов.

Версии: нет

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

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

 

Розенброк предложил в общем случае выбирать следующие значения параметров метода:  alpha = 3.0,  beta = 0.5.

Если  nstep ≠ 1, то в процессе поиска начальный шаг eps может быстро дробиться. Если при  nstep ≠ .1 по мнению пользователя процесс остановился слишком pано, то можно продолжить поиск из полученной точки или повторить счет, положив nstep равным 1.

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

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

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

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

    min  f(x) ,    x  E4 .
    f(x)  =  (x1 - 1)2 + 10 (x2 - 1)2 + 100 (x3 - 1)2 + 1000 (x4 - 1)2

   Тoчka бeзycлoвнoгo минимyмa    x* = (0., 0., 0., 0.) ,   f(x*) = 0.0

int main(void)
{
    /* Initialized data */
    static float alpha = 3.f;
    static float beta = .5f;
    static int n = 4;
    static int nstep = 1;
    static int maxk = 1000;
    static float epsy = 1e-6f;
    static int mkat = 50;
    static int mcyc = 10;

    /* System generated locals */
    int i__1;

    /* Local variables */
    static float blen[4];
    static int ierr;
    extern int mnb1r_c(int *, float *, float *, float *, int *, int *,
                       int *, float *, float *, int *, float *, float *,
                       float *, float *, float *, float *, float *, float *,
                       float *, U_fp, int *);
    static float d__[4], e[4], f;
    static int i__;
    static float v[16] /* was [4][4] */, x[4];
    extern int funct_c();
    static float aj[4], al[16] /* was [4][4] */,
                        bl[16] /* was [4][4] */, afk[4], eps[4];

    i__1 = n;
    for (i__ = 1; i__ <= i__1; ++i__) {
        eps[i__ - 1] = .1f;
/* l100: */
        x[i__ - 1] = 0.f;
    }
    mnb1r_c(&n, x, &f, eps, &maxk, &mkat, &mcyc, &alpha, &beta, &nstep, &epsy,
            afk, v, bl, al, d__, blen, aj, e, (U_fp)funct_c, &ierr);

    printf("\n %5i \n", ierr);
    printf("\n %5i \n", mkat);
    printf("\n %5i \n", maxk);
    printf("\n %12.5e \n", f);
    printf("\n %12.5e %12.5e %12.5e %12.5e \n", x[0], x[1], x[2], x[3]);
/* l1007: */
    return 0;
} /* main */

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

    /* Parameter adjustments */
    --x;

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


Результаты:

      ierr  =  0
      oбщee число этапов   18
      число вычислений ф-ции   607
      значение функционала  =  4.4558-7

      значение независимых переменных
      x(1)  =  0.99950 + 00
      x(2)  =  0.10001 + 01
      x(3)  =  0.10001 + 01
      x(4)  =  0.10001 + 01