last_version
.pdfНижегородский государственный университет им. Н. И. Лобачевского
Радиофизический факультет Кафедра математики
Отчет по лабораторная работе:
Безусловный экстремум. Введение в численные методы.
Выполнила:
студентка 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