Текст подпрограммы и версий mnb1r_c.zip |
Тексты тестовых примеров tmnb1r_c.zip |
Решение задачи безусловной минимизации функции многих переменных методом Розенброка.
Для решения задачи: 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