Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
02.05.2014
Размер:
178.69 Кб
Скачать

Цель работы: знакомство с оптимизационными задачами, изучение различных методов одномерной оптимизации и сравнение эффективности их применения для конкретных целевых функций.

Задание: Минимизировать функцию f(x)=

Отрезок неопределенности [-1,0], число точность =10-3

Методы:

б) пассивный поиск минимума

г) метод дихотомии

ж) метод касательных

Метод дихотомии

Это алгоритм блочного поиска для ni=n=2, т.е. когда в блоке два эксперимента. Так как пассивная составляющая алгоритма, т.е. блок, содержит четное число экспериментов, то оптимальный выбор точек , в которых необходимо провести эксперименты, будет неравномерным, в отличие от предыдущих алгоритмов, где число экспериментов в блоке было нечетным и, соответственно, расположение точек равномерным. Если блок содержит два эксперимента, то оптимальное (дельта оптимальное) расположение точек, в которых будут проводится эксперименты, это как можно ближе к середине отрезка. Такое расположение точек позволяет получить наименьший отрезок неопределенностей после экспериментов в блоке.

Схема алгоритма.

Шаг 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-a2, то x=(a+b)/2, и поиск заканчивается. Иначе перейти к шагу 2.

После к итераций общее число экспериментов будет N=2к, а длина получившегося отрезка неопределенности . Следовательно, .

Метод касательных

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

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

В точке с производятся вычисления и . Если , то решением задачи будет . Если же , то в качестве следующего отрезка неопределённости будет . Если же , то – отрезок . Процесс повторяется до тех пор, пока или отрезок неопределённости не достигнет заданной точности.

Схема алгоритма

Шаг 1. Заданы . Вычислить .

Шаг 2. Если , то полагаем . Поиск окончен. Если , то вычислить . Если z=0, то полагаем и поиск окончен. Если , то . Если , то . Повторить шаг 2.

Пассивный поиск минимума

Отрезок [a,b] исходный отрезок неопределенности. Пусть N - число точек, в которых необходимо провести вычисления целевой функции f(x), т.е. N экспериментов. Точки, в которых необходимо провести эксперименты, определяются следующим образом:

Среди вычисленных значений {f(xi)} (i=1,N), ищется точка xj , в которой достигается минимум:

f(xj)= min f()

1iN

Найденная точка принимается за приближенное решение задачи . Исходный отрезок неопределенности [a,b] после экспериментов в N точках сужается до [xj-1,xj+1], длина которого равна:

Точность найденного решения равна половине отрезка неопределенности, т.е. , где и x* - точное решение.

Процедуры методов

------------- Метод дихотомии ----------------

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 := abs(x-d)+exp(10*(x-d));

y2 := abs(x+d)+exp(10*(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:=abs(x5)+exp(10*(x5));

end

else goto giim;

Form1.Label1.Caption := IntToStr(m);

Form1.Label2.Caption := currToStr(X5);

Form1.Label3.Caption := currToStr(Y5);

end;

------------- Пассивный метод -----------------

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 := abs(x)+exp(10*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 := abs(x1)+exp(10*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;

-------- Метод касательных -------------

procedure TForm1.BitBtn8Click(Sender: TObject);

var

a : real;

m : integer;

d,b,e,c,y1,y2,z1,z2,y,z,Y5,X5 : currency;

label looop, lop, loop;

begin

a := StrToCurr(form1.Edit11.Text);

b := StrToCurr(form1.Edit12.Text);

e := StrToCurr(form1.Edit13.Text);

d := e/100;

y1 := abs(a)+exp(10*a);

y2 := abs(b)+exp(10*b);

if (a>0)and(b=0) then z1 :=1+10*exp(10*a);

if (a<0)and(b=0) then z1 :=-1+10*exp(10*a);

if (b>0)and(a=0) then z2 :=1+10*exp(10*b);

if (b<0)and(a=0) then z2 :=-1+10*exp(10*b);

m := 2;

while (b-a)>(2*e) do begin

c := ((b*z2 - a*z1)-(y2 - y1))/(z2 - z1);

y := abs(c)+exp(10*c);

if c>0 then z :=1+10*exp(10*c);

if c<0 then z :=-1+10*exp(10*c);

if z = 0 then begin

X5 := c; Y5 := y;

goto looop; end;

if z < 0 then begin

a := c; y1 := y; z1 := z;

end;

if z > 0 then begin

b := c; y2 := y; z2 := z;

end;

m:=m+1;

end;

looop:

X5 := (a+b)/2;

Y5 := abs(X5)+exp(10*X5);

Form1.Label25.Caption := IntToStr(m);

Form1.Label26.Caption := currToStr(X5);

Form1.Label27.Caption := currToStr(Y5);

end;

end.

Сравнение результатов:

x

y

Количество экспериментов

Пассивный поиск минимума

-0,23

0,3303

99

Метод дихотомии

-0,2266

0,3303

12

Метод касательных

-0,2299

0,3302

6

Вывод: Метод касательных показывает лучшие результаты, чем метод дихотомии и пассивный поиск минимума, т.к. количество экспериментов, получаемых этим методом, меньше. В свою очередь – метод дихотомии показывает лучшие результаты по сравнению с пассивным поиском минимума

Соседние файлы в папке Отчет