Лабораторная работа №34 / lab3
.docСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра ВТ
Лабораторная работа №3
Исследование методов линейного поиска.
Выполнили: студенты гр. 3372
Варакин Д.
Манакова М.
Проверил:
Санкт-Петербург,
2005 г.
Цель работы:
Разработка программы, реализующей комбинированную процедуру минимизации функции многих переменных в заданном направлении.
Вариант:
Вар. 3: функция f(x1, x2) = –12x2 + 4x12 + 4x22 – 4x1x2, начальная точка x = (–0.5; 1), значение минимума (0.5; 1).
Описание метода:
Представим функцию от 2-х перемнных в виде функции одной переменной по заданному направлению и реализуем для нее методы:
Метод Больцано:
Начальный этап. Для запуска метода необходимо:
(1) задать [a1,b1]- начальный интервал локализации минимума, на границах которого знаки производных различны, т.е. f'(a1)f'(b1)<0; - малое положительное число;
(2) положить к=1 и перейти к основному этапу.
Основной этап
Шаг 1. Взять пробную точку хk в центре текущего интервала и проверить критерий окончания поиска: (1) xk = (ak + bk)/2; (2) если f'(xk) ≤ и Lk= bk - ak≤ , то остановиться (хk = х* -аппроксимирующий минимум).
Шаг 2. Сократить текущий интервал:
(1) Если f (xk) > 0, то положить ak+1 = ak и bk+1 =xk, в противном случае - ak+1 =xk, bk+1 =bk;
(2) заменить k на k+1 и вернуться на шаг 1.
Метод Давидона:
Начальный этап
-
Выбрать ε, x0, p, α1
-
Предполагается, что сработал метод Свенна и получен интервал [a, b].
Основной этап
-
Найти аппроксимирующий минимум, т.е. точку d по формулам:
-
Проверить КОП: если y`r≤ ε, то остановиться, х=a+αrp. Иначе: сократить ТИЛ: если y`r <0, то [r,b], если y`r >0, то [a,r].
Положить k=k+1 и вернуться на шаг 1.
Спецификация основных переменных и функций:
-
Имя
Тип
Входные данные
Вых. данные
Описание
Eps
double
-
-
Точность вычислений.
a, b
double
-
-
Значения промежуточных инетрвалов.
F()
-
Vector x
double Func(x)
Заданная функция.
Grad()
-
Vector
Vector
Градиент в данной точке.
dF_dA
-
Vector x, p
double
Производная в точке х по направлению р
F_A
-
Vector x, p, double Alpha
double
Значение одномерной функции со смещением Alpha от точки х в направлении р.
Swann4()
-
double *a, *b
double *a, *b
Реализация алгоритма Свенна-4.
Bolcano
-
double a, b, …
double x
Реализует алгоритм Больцано.
Davidon
-
double a, b, …
double x
Реализует алгоритм Давидона.
Текст программы:
#include "stdio.h"
#include "conio.h"
#include "math.h"
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define Eps 0.001
class Vector
{
public:
double x1;
double x2;
Vector (double a, double b) {x1 = a; x2 = b;}
Vector (void) {};
Vector Move (Vector Direction, double Alpha)
{
double xx1 = x1 + Direction.x1*Alpha;
double xx2 = x2 + Direction.x2*Alpha;
return Vector(xx1, xx2);
}
};
double mod (double x)
{
return (x > 0) ? x : -x;
}
// Заданная функция
double F (Vector X)
{
return -12*X.x2+4*X.x1*X.x1+4*X.x2*X.x2-4*X.x1*X.x2;
}
// Градиент в точке Х
Vector Grad (Vector X)
{
Vector g (8*X.x1 - 4*X.x2, -12 + 8*X.x2 - 4*X.x1);
return g;
}
// Производная в точке Х по направлению Р
double dF_dA (Vector X, Vector p)
{
Vector g = Grad(X);
return g.x1*p.x1 + g.x2*p.x2;
}
// Значение одномерной функции от Alpha по направлению р из точки х
double F_A (Vector x, Vector p, double Alpha)
{
Vector Z (x.x1 + Alpha*p.x1, x.x2 + Alpha*p.x2);
return F(Z);
}
// Метод Свенна-4
void Swann4 (double *a, double *b, Vector x, Vector p)
{
double Alpha = 0.001 * mod(F(x));
if (dF_dA (x, p) > 0) {p.x1 = -p.x1; p.x2 = -p.x2;}
while (dF_dA (x.Move(p, Alpha), p) * dF_dA (x.Move(p, 2*Alpha), p) > 0) Alpha *= 2;
*a = min(Alpha/2, 2*Alpha);
*b = max(Alpha/2, 2*Alpha);
}
double Bolcano (double a, double b, Vector x, Vector p)
{
double z = 0;
while ((b-a) > Eps)
{
z = (a + b) / 2;
if (dF_dA(x.Move(p, z),p) > 0) b = z;
else a = z;
}
return z;
}
double Davidon (double a, double b, Vector x, Vector p)
{
double z, w, g, min;
bool done = false;
// f'(a) = dF_dA (x.Move(p, a), p)
// f'(b) = dF_dA (x.Move(p, b), p)
// f (a) = F (x, p, a)
// f (b) = F (x, p, b)
while (!done)
{
z = dF_dA (x.Move(p, a), p) + dF_dA (x.Move(p, b), p) + 3 * ((F_A (x, p, a) - F_A (x, p, b))/b);
w = sqrt (z*z - dF_dA (x.Move(p, a), p) * dF_dA (x.Move(p, b), p));
g = (z - dF_dA (x.Move(p, a), p) + w) / (dF_dA (x.Move(p, b), p) - dF_dA (x.Move(p, a), p) + 2*w);
min = a + g * (b - a);
done = (mod(dF_dA (x.Move(p, min), p)) < Eps) || (min == a) || (min == b);
if (!done)
{
if (dF_dA (x.Move(p, min), p) > 0) b = min;
else a = min;
}
}
return min;
}
void main (void)
{
Vector StartPoint (-0.5, 1),
Direction (1, 0);
double a = 0, b = 0;
Swann4 (&a, &b, StartPoint, Direction);
printf ("Swann : a = %f, b = %f\n\n", a, b);
double min1 = Bolcano(a, b, StartPoint, Direction);
printf ("Bolcano min : %f (%f, %f)\n\n", min1,
StartPoint.x1 + min1*Direction.x1, StartPoint.x2 + min1*Direction.x2);
double min2 = Davidon(a, b, StartPoint, Direction);
printf ("Davidon min : %f (%f, %f)\n\n", min2,
StartPoint.x1 + min2*Direction.x1, StartPoint.x2 + min2*Direction.x2);
printf ("Real min : (0.500000, 1.000000)");
getch();
}
Примеры выполнения программы:
-
Точность
Результаты
Eps = 10-4
Swann : a = 0.320000, b = 1.280000
Bolcano min : 0.999980 (0.499980, 1.000000)
Davidon min : 1.000011 (0.500011, 1.000000)
Real min : (0.500000, 1.000000)
Eps = 10-3
Swann : a = 0.320000, b = 1.280000
Bolcano min : 0.999687 (0.499687, 1.000000)
Davidon min : 1.000011 (0.500011, 1.000000)
Real min : (0.500000, 1.000000)
Eps = 10-2
Swann : a = 0.320000, b = 1.280000
Bolcano min : 1.002500 (0.502500, 1.000000)
Davidon min : 1.000405 (0.500405, 1.000000)
Real min : (0.500000, 1.000000)
Ответы на контрольные вопросы:
-
Пояснить организацию линейного поиска на основе методов золотого сечения, Фибоначчи и Пауэлла.
Поиск минимума по направлению производится с использованием одномерных методов, т.е. сначала многомерная функция сводится к одномерной функции зависящей от смещения по заданному направлению из заданной точки, а потом для неё вызывается один из методов одномерной минимизации
-
Аналитически найти производную в точке x1 = (1; 0)t по направлению p1 = (1; 1)t для функции y(x) = x12 – x1x2 + 2x22 – 2x1
y’x1 = 2 x1 - x2 – 2; y’x2 = - x1 + 4 x2;
grad (x1) = [ 0 ; -1];
y’ = 0*1 + (-1)*1 = -1;
-
Как изменится процедура минимизации методами Больцано, дихотомии, ДСК, Дэвидона при переходе от поиска на числовой прямой к поиску на плоскости R2?
-
Что является направлением наискорейшего спуска в точке x1 = (1; 1)t для целевой функции y(x) = x12 + 2x22?
Градиент = (2; 4)
-
Привести 2 способа аналитического решения задачи для Вашего варианта задания.
-
Найти минимум y(x) = x12 – x1x2 + 2x22 – 2x1 + ex1 + x2, двигаясь из точки x1 = (0; 0)t в направлении наискорейшего спуска.
Градиент = (1; 1).
Выводы:
Мы разработали программы, реализующей процедуры минимизации функции многих переменных в заданном направлении.