Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

last_version

.pdf
Скачиваний:
19
Добавлен:
27.03.2015
Размер:
417.05 Кб
Скачать

Нижегородский государственный университет им. Н. И. Лобачевского

Радиофизический факультет Кафедра математики

Отчет по лабораторная работе:

Безусловный экстремум. Введение в численные методы.

Выполнила:

студентка 424 группы

Корепова Дарья

Проверили:

Кулинич Виктор Валентинович Ушаков Юрий Владимирович

Нижний Новгород 2012 год

Постановка задачи.

Найти точки минимума ф-и

f(x; y) = 100(x y2)2 + 10(1 y2)2

методом Хука-Дживса (случай А). Для одномерной задачи минимизации использовать метод Фибоначчи. Для нахождения интервала унимодальности использовать алгоритм скользящего окна. В окрестности точки минимума оценить овражность и построить линии уровня и траекторию поиска. Провести подробные расчёты по заданному алгоритму перехода из первой точки в последующую. Алгоритм Хука-Дживса оформить в виде ф-и от произвольного числа переменных.

Описание алгоритмов.

1. Метод Хука-Дживса.

Алгоритм включает два основных этапа: а) исследующий поиск вокруг базисной точки xk; б) поиск "по образцу т.е. в направлении, выбранном для минимизации.

В первую очередь задаётся начальная точка поиска xk и начальное приращение (шаг) h. После этого начинается исследующий поиск.

Исследующий поиск. Делаем пробный шаг по первой переменной x1 с заданным шагом h > 0, т.е. вычисляем значение функции в точке (xk1 +h; xk2 ; ::; xkn) и если f(xk1 +h; xk2 ; ::; xkn) > f(xk1 ; :::; xkn), тогда точку (xk1 ; :::; xkn) оставляем без изменений и делаем пробный шаг в противоположном направлении. Если f(xk1 h; xk2 ; ::; xkn) > f(xk1 ; :::; xkn) , тогда точку (xk1 ; :::; xkn) оставляем без изменений, иначе заменяем её на точку (xk1 + h; xk2 ; ::; xkn) или (xk1 h; xk2 ; ::; xkn) в зависимости от того, где значение функции меньше исходного. Из вновь полученной точки делаем пробные шаги по оставшимся координатам, используя тот же алгоритм. Если в процессе исследующего поиска не удаётся сделать ни одного удачного пробного шага, то необходимо уменьшить шаг h. После чего вновь переходим к исследующему поиску. Если в процессе исследующего поиска сделан хотя бы один удачный пробный шаг, то переходим к поиску по образцу.

Поиск по образцу. После исследующего поиска мы получаем точку xk. Направление pk = xk xk определяет направление, в котором функция умень-

2

шается. Поэтому проводим минимизацию функции в указанном направлении,

решая задачу

f(xk + kpk) = minf(xk + pk)

Если удаётся сделать удачный шаг в поиске "по образцу то в результате находим новое приближение xk+1 = xk + kpk

Из точки xk+1 начинаем новый исследующий поиск и т.д.

2. Алгоритм скользящего окна.

Для выбранной исходной точки x0 и выбранного окна шириной 2h > 0 около точки x0 проверяется условие унимодальности

f(x0 h) > f(x0) < f(x0 + h)

Если условие выполнено, то считается, что интервал унимодальности найдён, в противном случае проверяется условие

f(x0 h) > f(x0 + h)

Если последнее выполнено, тогда окно сдвигается вправо от точки x на h=2, иными словами, точка x заменяется на точку x = x + h=2.

В противном случае окно сдвигается влево от точки x.

3. Метод Фибоначчи.

Пусть f(x) унимодальна на [a; b]. Вычислив значения f(x1) и f(x2) в любой паре точек x1; x2 2 [a; b]; x1 < x2, можно найти отрезок неопределённости более узкий, чем первоначальный отрезок [a; b]. Действительно, если f(x1) < f(x2), то это будет отрезок [a; x2], а в случае f(x1) > f(x2), то таким отрезком будет [x1; b], а в случае f(x1) = f(x2) - отрезок [x1; x2].

Используя последовательно указанное свойство, можно постепенно сужать отрезок неопределённости. В методе Фибоначчи точки x1 и x2 на каждом отрезке неопределённости [a; b] выбираются по правилу

x1 = a + Fn (b a); x2 = a + b x1

Fn+2

Здесь (F )1n=1 - последовательность чисел, определяемая реккурентным соотношением

Fn+2 = Fn+1 + Fn; F1 = F2 = 1

3

4. Применимость указанных алгоритмов.

Описанные выше алгоритмы применимы к нашей функции

f(x; y) = 100(x y2)2 + 10(1 y2)2

т.к. она непрерывна на всём множестве действительных чисел. Непрерывность следует из отсутствия точек разрыва ф-и.

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

Возьмём произвольную начальную точку (3; 1) и начальное приращение (шаг) h = 0:2.

a) Исследующий поиск вокруг базисной точки (3; 1).

f(x0; y0) = f(3; 1) = 400:0

делаем пробный шаг вдоль оси x: f(x0 + h; y0) = f(3:2; 1) = 484:00

получили, что f(x0 + h; y0) > f(x0; y0), значит оставляем нач.точку без изменений и делаем шаг в противоположную сторону:

f(x0 h; y0) = f(2:8; 1) = 323:99

получили, что f(x0 h; y0) < f(x0; y0), значит заменяем точку (3; 1) на точку (2:8; 1) и делаем пробный шаг по координате y:

f(x0 h; y0 h) = f(2:8; 0:8) = 467:85

получили, что f(x0 h; y0 h) > f(x0 h; y0), значит оставляем точку без изменений и делаем шаг в противоположную сторону:

f(x0 h; y0 + h) = f(2:8; 1:2) = 186:89

получили, что f(x0 h; y0 + h) < f(x0 h; y0), значит меняем точку (2:8; 1) на

(2:8; 1:2).

b) Считаем угол , образованный между направлением поиска и положительным направлением оси x.

4

Итак, имеем новую точку с координатами x1 = 2:8; y1 = 1:2

 

 

sin =

 

 

y1 y0

 

=

y1 y0

=

 

1:2 1

= 0:707

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p(y1 y0)2 + (x1 x0)2 hp2

 

 

0:2p2

 

 

cos =

 

 

 

x1 x0

=

x1 x0

 

=

2:8 3

=

 

0:707

 

 

 

 

 

 

 

 

 

 

 

p(y1 y0)2 + (x1 x0)2

 

 

 

hp2

 

0:2p2

 

 

c) Одномерная функция:

f (p) = f(x0 + p cos ; y0 + p sin )

d) Считаем pmax в направлении поиска.

Пусть xmax = 10, ymax = 10, xmin = 10, ymin = 10.

Через точки (x0; y0) и (x1; y1) проходит прямая y = (tg )x + b, где tg = sincos = 1

b = y0 (tg )x0 = 4

При y = ymax: 10 = x + 4, x = 6.

p p pmax = (ymax y0)2 + (jx j + x0)2 = 9 2

e) Поиск интервала унимодальности [a; b] (методом скользящего окна).

Пусть h = 0:3

1. f (0) = 400:00 f (h=2) = 279:57 f (h) = 176:07

Получили, что f (0) > f (h=2) > f (h), значит двигаемся на h=2 вправо. 2. f (3h=2) = 94:58

Получили, что f (h=2) > f (h) > f (3h=2), значит двигаемся на h=2 вправо. 3. f (2h) = 40:52

Получили, что f (h) > f (3h=2) > f (2h), значит двигаемся на h=2 вправо.

5

4. f (5h=2) = 19:63

Получили, что f (3h=2) > f (2h) > f (5h=2), значит двигаемся на h=2 вправо. 5. f (3h) = 38:02

Получили, что f (2h) > f (5h=2) < f (3h), значит a = 2h = 0:6; b = 3h = 0:9

f) Поиск pmin в интервале унимодальности методом Фибоначчи.

Зададим точность: e = 0:03. Проверка: ja bj = 0:3 > e.

В методе Фибоначчи точки p1 и p2 на каждом отрезке неопределённости [a; b] выбираются по правилу:

p1 = a +

Fn

(b a); p2

= a + b p1;

Fn+2

где (F )1n=1 - последовательность чисел, определяемая реккурентным соотношением

Fn+2 = Fn+1 + Fn; F1 = F2 = 1

1) p1 = a + F2(b a)=F4 = 0:6 + (0:9 0:6)=3 = 0:70, p2 = a + b p1 = 0:80 f (p1) = 22:5451

f (p2) = 21:0938

f (p1) > f (p2), значит a = p1 = 0:70, b = 0:80

2) p1 = a + F3(b a)=F5 = 0:7 + (0:9 0:7)=5 = 0:78, p2 = a + b p1 = 0:82 f (p1) = 19:9740

f (p2) = 22:9485

f (p1) < f (p2), значит a = 0:70, b = p2 = 0:82

3) p1 = 0:745, p2 = 0:775 f (p1) = 19:7376

f (p2) = 19:8071

f (p1) < f (p2), значит a = 0:70, b = p2 = 0:775

4) p1 = 0:728, p2 = 0:746 f (p1) = 20:3501

f (p2) = 19:7111

f (p1) > f (p2), значит a = p1 = 0:728, b = 0:775

6

5) p1 = 0:746, p2 = 0:757 f (p1) = 19:7051

f (p2) = 19:5742

f (p1) > f (p2), значит a = p1 = 0:746, b = 0:775

6) p1 = 0:757, p2 = 0:764 f (p1) = 19:5743

f (p2) = 19:5979

f (p1) < f (p2), значит a = 0:746, b = p2 = 0:764

Видим, что f (p2) f (p1) = 19:5979 19:5743 = 0:023, т.е. меньше установленной точности e = 0:03, значит можем остановить поиск.

pmin = a + b = 0:746 + 0:764 = 0:755 2 2

g) Определение минимума двумерной функции f(x; y).

xmin = x0 + pmincos = 2:465; ymin = y0 + pminsin = 1:534

Далее полученные значения xmin и ymin необходимо принять за x0 и y0 и продолжить поиск точки минимума функции f(x; y) (т.е. вернуться к пункту а), базисной теперь будет точка (xmin; ymin)).

7

Код программы, выполняющей поиск минимума заданной функции.

Алгоритм Хука - Дживса оформлен для функции от произвольного числа переменных (от N).

#include<stdio.h> #include <math.h> #define N 50

float func(float z0[N],float f[N][1]) // заданная функция, от N перем-х

{

int i;

for (i=0;i<N;i++) f[i][1]=z0[i];

return 100.*(f[0][1]-(f[1][1])*(f[1][1]))*(f[0][1]-(f[1][1])*(f[1][1]))+ 10.*(1 - (f[1][1])*(f[1][1]))*(1 - (f[1][1])*(f[1][1]));

}

float f1d(float x0,float y0,float p,float si,float co, float f[N][1])//одномерн.ф-я

{

float z3[50]; z3[0]=x0+p*co; z3[1]=y0+p*si; return func(z3,f);

}

 

float fib(float n)

//числа Фибоначчи

{

 

if ((n==1)||(n==2)) return 1.;

return fib(n-1)+fib(n-2);

}

void hj (float z0[N],float h, float f[N][1], float *z) // ф-я Хук-Дживс

{

8

float z1[N],z2[N]; int i,j;

for (j=0;j<N;j++)

{

z1[j]=z0[j];

z2[j]=z0[j];

}

for (i=0;i<N;i++)

{

z1[i]=z0[i]+h; z2[i]=z0[i]-h;

if (func(z1,f)<func(z0,f)) z[i]=z0[i]+h;

if (func(z2,f)<func(z0,f)) z[i]=z0[i]-h;

if ((func(z1,f)==func(z0,f))&&(func(z2,f)==func(z0,f))) z[i]=z0[i];

z1[i]=z[i];

z2[i]=z[i];

}

}

int main()

{

float z[N];

float z0[N],f[N][1];

float x01,y01,k,x2,y2,m,pmin,e=0.0001,p1,p2,a,b,n,p,si,co,x1,y1,x0,y0,h=0.02; int xmax=10,xmin=-10,ymax=10,ymin=-10;

int i,j;

printf("vvedite x0,y0: "); scanf("\%f\%f",&z0[0],&z0[1]);

9

x0=z0[0];

y0=z0[1];

x01=500000.;

y01=500000.;

FILE *file = fopen("file.dat","w"); fprintf(file,"\%e \%e\n", x0, y0);

while ((fabs(x0-x01)>e) && (fabs(y0-y01)>e)) // повтор всех методов

{

hj(z0,h,f,z); //заполнился массив z[N]

x1=z[0]; //новая точка y1=z[1];

si=(y1-y0)/(h*sqrt(2.)); // sin(alpha) и cos(alpha) co=(x1-x0)/(h*sqrt(2.));

n=0.;

while (f1d(x0,y0,h*n/2.,si,co,f)>f1d(x0,y0,h*(n+1.)/2.,si,co,f)) n++;//для поиска интервала унимодальности

a=h*(n-1.)/2.; //границы интервала унимод-ти b=h*(n+1.)/2.;

k=1;

while ((fabs(a-b)>e)&&(m>e))

{

p1=a+(b-a)*fib(k)/fib(k+2.); //метод Фибоначчи p2=a+b-p1;

if (f1d(x0,y0,p1,si,co,f)>f1d(x0,y0,p2,si,co,f))

{

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]