Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/mn_htm_c/mnb6r_c.htm
Дата изменения: Thu Apr 30 07:56:18 2015 Дата индексирования: Sun Apr 10 02:03:18 2016 Кодировка: Windows-1251 |
Текст подпрограммы и версий mnb6r_c.zip , mnb6d_c.zip |
Тексты тестовых примеров tmnb6r_c.zip , tmnb6d_c.zip |
Решение задачи безусловной минимизации функции многих переменных без вычисления производной.
Для решения задачи
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