
Лабораторная работа №1 / отчет
.doc
Цель работы: знакомство с оптимизационными задачами, изучение различных методов одномерной оптимизации и сравнение эффективности их применения для конкретных целевых функций.
Задание:
Вариант 10:
Методы одномерной безусловной оптимизации:
а) пассивный оптимальный алгоритм;
б) метод дихотомии;
в) метод парабол.
Целевая функция: 10 * cos(x) + ex ;
Отрезок [a;b]: [0;3] ;
Точность искомого решения: = 5*10-4.
График целевой функции:
X= |
Y= |
0 |
11 |
0,1 |
11,05521 |
0,2 |
11,02207 |
0,3 |
10,90322 |
0,4 |
10,70243 |
0,5 |
|
0,6 |
10,07547 |
0,7 |
9,662175 |
0,8 |
9,192608 |
0,9 |
8,675703 |
1 |
8,121305 |
1,1 |
7,540127 |
1,2 |
6,943694 |
1,3 |
6,344285 |
1,4 |
5,754871 |
1,5 |
5,189061 |
1,6 |
4,661037 |
1,7 |
4,185502 |
1,8 |
3,777627 |
1,9 |
3,452999 |
2 |
3,227588 |
2,1 |
3,117709 |
2,2 |
3,140002 |
2,3 |
3,311422 |
2,4 |
3,649239 |
2,5 |
4,171058 |
2,6 |
4,894851 |
2,7 |
5,83901 |
2,8 |
7,022423 |
2,9 |
8,464564 |
3 |
10,18561 |
Методы поиска:
1) Метод дихотомии :
Схема алгоритма:
Шаг 1. Задаются a,b, и - малое положительное число, значительно меньшее чем .
Шаг 2. Определяется середина отрезка x=(a+b)/2. Производятся эксперименты в двух точках близких середине: y1=f(x-), y2=f(x+).
Шаг 3. Определяется следующий отрезок локализации, т.е. определяется какой из отрезков [a,x+] или [x-,b] содержит точное решение x*. Если y1y2, то это отрезок [a,x+] и b=x+, иначе это отрезок [x-,b] и a=x-, т.е. выбранный отрезок локализации мы снова обозначили как [a,b].
Шаг
4.Если b-a2,
то x=(a+b)/2,
и поиск заканчивается. Иначе перейти к
шагу 2.
Текст программы метода:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
m : integer;
a,b,d,e,x,y1,y2,X5,Y5 : real;
label giim;
begin
a := StrToCurr(form1.Edit1.Text);
b := StrToCurr(form1.Edit2.Text);
e := StrToCurr(form1.Edit3.Text);
d := e/100;
m:=0;
giim:
x := (a+b)/2;
y1 := 10*cos(x-d)+exp(x-d);
y2 := 10*cos(x+d)+exp(x+d);
if y1<y2 then b:=x+d
else a:=x-d;
m:=m+2;
if (b-a) <= 2*e then
begin
X5:=(a+b)/2;
Y5:=10*cos(x+d)+exp(x+d);
end
else goto giim;
Form1.Label1.Caption := IntToStr(m);
Form1.Label2.Caption := currToStr(X5);
Form1.Label3.Caption := currToStr(Y5);
end;
2) Метод парабол :
Схема алгоритма:
Шаг 1. Задаются a,c,b и . Вычислить ya=f(a), yc=f(c), yb=f(b).
Шаг 2. Вычислить
,
y=f(x),
где
Шаг 3. А) При x<c.
Если y<yc, то b=c, c=x, yb=yc, yc=y.
Если y>yc, то a=x, ya=y.
Если y=yc, то a=x, b=c, c=(x+c)/2, ya=y, yb=yc, yc=f(c).
Б) При x>c.
Если y<yc, то a=c, c=x, ya=yc, yc=y.
Если y>yc, то b=x, yb=y.
Если y=yc, то a=c, b=x, c=(x+c)/2, ya=yc, yb=y, yc=f(c).
Шаг
4. Если b-a,
то закончить поиск, положив
,
иначе перейти к шагу 2.
Текст программы метода:
procedure TForm1.BitBtn4Click(Sender: TObject);
var
m : integer;
a,b,c,e,x,y,X5,Y5,ya,yb,yc,t,t1 : real;
label ttt,eee;
begin
a := StrToCurr(form1.Edit4.Text);
b := StrToCurr(form1.Edit5.Text);
c := StrToCurr(form1.Edit6.Text);
e := StrToCurr(form1.Edit7.Text);
m := 3;
ya := 10*cos(a)+exp(a);
yb := 10*cos(b)+exp(b);
yc := 10*cos(c)+exp(c);
ttt:
t := c+(0.5*(((sqr(b-c)*(ya-yc))-(sqr(c-a)*(yb-yc)))/(((b-c)*(ya-yc))+((c-a)*(yb-yc)))));
if t<>c then x := t
else x := (a+c)/2;
y := 10*cos(x)+exp(x);
if x<c then begin
if y<yc then begin
b := c; c := x; yb := yc; yc := y; goto eee; end;
if y>yc then begin
a := x; ya := y; goto eee; end;
if y=yc then begin
a := x; b := c; c := (x+c)/2; ya := y; yb := yc;
yc := 10*cos(c)+exp(c); goto eee; end;
end;
if x>c then begin
if y<yc then begin
a := c; c := x; ya := yc; yc := y; goto eee; end;
if y>yc then begin
b := x; yb := y; goto eee; end;
if y=yc then begin
a := c; b := x; c := (x+c)/2; ya := yc; yb := y;
yc := 10*cos(c)+exp(c); goto eee; end;
end;
eee:
m := m+1;
if (b-a) <= e then begin
X5 := x; Y5 := y; end
else goto ttt;
Form1.Label10.Caption := IntToStr(m);
Form1.Label13.Caption := CurrToStr(X5);
Form1.Label14.Caption := CurrToStr(Y5);
end;
3) Пассивный метод:
Схема алгоритма:
Шаг
1. Задаются a,c,b
и .
Вычислить
=
/100, N=((b-a)
/)
-1.
Шаг 2. Определяются точки, в которых необходимо провести эксперименты:
Шаг 3. Среди вычисленных значений {f(xi)} (i=1,N), ищется точка xj , в которой достигается минимум:
f(xj)=
min f()
1 I N
Шаг
4. Выводим полученные значения
.
Текст программы:
procedure TForm1.BitBtn6Click(Sender: TObject);
var
n,r: integer;
a,b,e,X5,Y5,k,x,y,d,x1,h : currency;
label lop,loop;
begin
a := StrToCurr(form1.Edit8.Text);
b := StrToCurr(form1.Edit9.Text);
e := StrToCurr(form1.Edit10.Text);
d := e/100;
h := ((b-a)/e)-1;
Form1.Label21.Caption := CurrToStr(h);
n := StrToInt(form1.Label21.Caption);
if (n mod 2)<>0 then begin
r := 1;
lop:
x := a+(((b-a)/(n+1))*r);
y := 10*cos(x)+exp(x);
if y<Y5 then begin
Y5 := y; X5 := x; end;
r := r+1;
if n<>r then goto lop;
end
else begin
r := 1;
loop:
x := a+(((b-a)/(n+1))*r);
x1 := x-d;
y := 10*cos(x1)+exp(x1);
if y<Y5 then begin
Y5 := y; X5 := x1; end;
r := r+1;
if n<>r then goto loop;
end;
n := StrToInt(form1.Label21.Caption);
Form1.Label18.Caption := IntToStr(n);
Form1.Label19.Caption := CurrToStr(X5);
Form1.Label20.Caption := CurrToStr(Y5);
end;
Таблица сравнения результатов рассмотренных методов :
Метод |
Кол-во экспериментов |
Значение
|
Значение
|
Метод дихотомии |
24 |
2,1346 |
3,1096 |
Метод парабол |
27 |
2,1345 |
3,1096 |
Пассивный оптим. алгоритм |
5999 |
2,1325 |
3,1096 |
Вывод:
как видно из таблицы результатов все
методы выдали в итоге почти одинаковые
значения
и
.
Следует отметить, что заметно существенное
отличие в количестве экспериментов
между методами дихотомии, парабол и
пассивным методом. В ходе выполнения
работы получили, что метод дихотомии
является самым легко реализуемым и
наиболее эффективным среди этих трёх
методов. Пассивный метод плох тем, что
для достижения того же результата, при
той же точности искомого решения,
необходимо выполнить намного большее
количество экспериментов. Метод парабол
является нечто средним из двух методов,
однако его также не легко реализовать.