Скачиваний:
5
Добавлен:
01.05.2014
Размер:
86.53 Кб
Скачать

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

кафедра ВТ

Лабораторная работа №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.

Метод Давидона:

Начальный этап

  1. Выбрать ε, x0, p, α1

  2. Предполагается, что сработал метод Свенна и получен интервал [a, b].

Основной этап

  1. Найти аппроксимирующий минимум, т.е. точку d по формулам:

  1. Проверить КОП: если 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)

Ответы на контрольные вопросы:

  1. Пояснить организацию линейного поиска на основе методов золотого сечения, Фибоначчи и Пауэлла.

Поиск минимума по направлению производится с использованием одномерных методов, т.е. сначала многомерная функция сводится к одномерной функции зависящей от смещения по заданному направлению из заданной точки, а потом для неё вызывается один из методов одномерной минимизации

  1. Аналитически найти производную в точке 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;

  1. Как изменится процедура минимизации методами Больцано, дихотомии, ДСК, Дэвидона при переходе от поиска на числовой прямой к поиску на плоскости R2?

  1. Что является направлением наискорейшего спуска в точке x1 = (1; 1)t для целевой функции y(x) = x12 + 2x22?

Градиент = (2; 4)

  1. Привести 2 способа аналитического решения задачи для Вашего варианта задания.

  1. Найти минимум y(x) = x12 – x1x2 + 2x22 – 2x1 + ex1 + x2, двигаясь из точки x1 = (0; 0)t в направлении наискорейшего спуска.

Градиент = (1; 1).

Выводы:

Мы разработали программы, реализующей процедуры минимизации функции многих переменных в заданном направлении.