Текст подпрограммы и версий mnb5r_c.zip |
Тексты тестовых примеров tmnb5r_c.zip |
Решение задачи безусловной минимизации функции многих переменных по заданному направлению (задача одномерной минимизации) методом квадратичной аппроксимации.
Для решения задачи:
min f(x0 + λ s0) , -∞ < λ < ∞ , x0∈En , s0∈En , λ
x0 и s0 заданы, используется метод квадратичной аппроксимации Пауэлла.
Для определения отрезка вдоль направления s0, содержащего точку минимума функции f (x), используется алгоритм Девиса - Свена - Кемпи.
Минимум f (x) по направлению s0 считается найденным, если выполнено хотя бы одно из следующих условий:
1. |
min | xi - xi | ≤ XLIM , i где xi = x0 + λi s0 - три точки ( i = 1, 2, 3), по которым строится аппpоксимиpующая парабола, x = x0 + λ s0 - точка минимума параболы, а XLIM - заданная точность решения задачи по аpгументу; |
2. | | f (xk) - f (xk+1)| ≤ EPS, где xk = x0 + λk s0 - точка минимума аппpоксимиpующей параболы на k - ой итерации алгоритма Пауэлла, а EPS - заданная точность решения задачи по функционалу. |
Д.Химмельблау, Прикладное нелинейное программирование. Изд - во "Мир", M., 1975, 54 - 55.
int mnb5r_c (integer *n, real *x, real *s, real *xx, real *delx, real *eps, real *xlim, real *xmin, real *ymin, integer *kount, integer *ier, S_fp fun)
Параметры
n - | размерность пространства переменных (тип: целый); |
x - | вещественный вектоp длины n, задающий начальную точку x0 поиска минимума f (x) по направлению; |
s - | вещественный вектоp длины n, задающий направление s0 одномерной минимизации; |
xx - | вещественный вектоp длины n, используемый в подпрограмме как рабочий; |
delx - | заданный начальный шаг одномерного поиска (тип: вещественный); |
eps - | заданная точность вычисления одномерного минимума по функционалу (тип: вещественный); |
xlim - | заданная точность вычисления одномерного минимума по аpгументу (тип: вещественный); |
xmin - | вещественная переменная, содержащая расстояние до точки минимума f (x) вдоль s0, т.е. x* = x0 + xmin * s0; |
ymin - | вещественная переменная, содержащая вычисленное минимальное значение функции f (x) вдоль направления s0, т.е. ymin = f (x*); |
kount - | целая переменная, содержащая фактически выполненное число вычислений функции f (x) в процессе одномерной минимизации; |
ierr - | целочисленная переменная, указывающая пpичину окончания процесса: |
ierr= 0 - | найден минимум с заданной точностью; |
ierr= 1 - | установлено, что минимум f (x) вдоль направления s0 из заданной точки x0 не существует; |
fun - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма fun составляется пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид: int fun(float *x, float *f, float *fe) Параметры x - вещественный вектор длины n, задающий точку пространства, в которой вычисляется значение функции; f - вещественная переменная, содержащая вычисленное значение функции в точке x; fe - заданная точность вычисления значения функции в точке x (тип: вещественный). Параметр fe не должен переопределяться в теле подпрограммы fun и может не использоваться для вычисления f (x). |
min f(x) , x ∈ E1 , x0 = 0.0 , s0 = 1.0 , f(x) = 100 * e-x + x .
Точка минимума f(x) вдоль s pавна
xk = - ln (0.01) , f(xk) = i - ln (0.01)
int main(void)
{
/* Initialized data */
static int n = 1;
static float xlim = 1e-6f;
static float delx = .5f;
static float eps = 1e-7f;
/* Builtin functions */
double exp(double);
/* Local variables */
extern int func_c();
static float xmin, ymin;
extern int mnb5r_c(int *, float *, float *, float *, float *, float *,
float *, float *, float *, int *, int *, U_fp);
static float r__, s[1], x[1];
static int kount;
static float xx[1];
static int ier;
x[0] = 0.f;
s[0] = 1.f;
mnb5r_c(&n, x, s, xx, &delx, &eps, &xlim, &xmin, &ymin, &kount, &ier,
(U_fp)func_c);
printf("\n %5i \n", ier);
printf("\n %5i \n", kount);
printf("\n %16.7e \n", xmin);
printf("\n %16.7e \n", ymin);
r__ = (float)exp((float)(-xmin)) * -100.f + 1.f;
printf("\n %16.7e \n", r__);
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 = 0
kount = 15
xmin = 4.6057000 + 00
ymin = 5.6051700 + 00