Скачиваний:
52
Добавлен:
10.12.2013
Размер:
264.19 Кб
Скачать

Министерство образования и науки Российской Федерации

Пермский государственный технический университет

Кафедра ИТАС

Практическая работа №3.

Многомерные методы прямого поиска

(метод Наискорейшего спуска).

Вариант №1.

Выполнила студентка Дьякова О.Р.

Группа АСУ-02-2.

Принял Гольдштейн А.Л.

Пермь 2005

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

Нахождение минимума функции 8 * Х12 + 4 * Х12 + 5 * Х2 2 методом Наискорейшего спуска.

  1. Листинг программы:

function Myfunc(X1,X2:real;RealValue:boolean=False):real;

//Рабочая функция

begin

Result:=8*Sqr(X1)+4*X1*X2+5*Sqr(X2);

if not(MainForm.Min or RealValue) then Result:=-Result;

end;

//{---метод Наискорейшего спуска

procedure TMainForm.miQuickDescentClick(Sender: TObject);

var x11,x12,x21,x22,normGrad1,normGrad2,grad1,grad2:real;

i,t:longword;

begin

Screen.Cursor:=crHourGlass;

t:=GetTickCount;

RepForm.Show;

with RepForm.RepMemo.Lines do

begin

Append('Решение задачи методом Наискорейшего спуска');

Append('Начальные данные:');

Append('X1= '+FloatToStr(bX1));

Append('X2= '+FloatToStr(bX2));

Append('Eps= '+FloatToStr(Eps)+#13#10);

end;

i:=0; x21:=bX1; x22:=bX2;

try

miRepaint.Click;

with Graph.Canvas do

begin

with Pen do

begin Color:=clRed; Style:=psSolid; Width:=2; end;

MoveTo(Real2X(x21),Real2Y(x22));

end;

repeat

Inc(i); x11:=x21; x12:=x22; grad1:=dFdX1(x11,x12); grad2:=dFdX2(x11,x12);

normGrad1:=grad1/Hypot(x11-grad1,x12-grad2);normGrad2:=grad2/Hypot(x11-grad1,x12-grad2);

MinH(x21,x22,x21-d1*10,x22-d2*10); Graph.Canvas.LineTo(Real2X(x21),Real2Y(x22));

if miDebug.Checked then with RepForm.RepMemo.Lines do begin

Append('Шаг '+IntToStr(i)+'; '+FloatToStr((GetTickCount-t)/1000)+' сек');

Append('X1= '+FloatToStr(x21));

Append('X2= '+FloatToStr(x22));

Append('F(X1,X2)= '+FloatToStr(F(x21,x22,True)));

Append('----------------------------------------'); end;

until Hypot(x21-x11,x22-x12)<Eps;

with RepForm.RepMemo.Lines do

begin Append

('Задача решена за '+IntToStr(i)+' шаг(а,ов); '+FloatToStr((GetTickCount-t)/1000)+' сек');

Append('Решение:');

Append('X1= '+FloatToStr(x21));

Append('X2= '+FloatToStr(x22));

Append('F(X1,X2)= '+FloatToStr(F(x21,x22,True)));

Append('========================================'#13#10); end;

finally Screen.Cursor:=crDefault; end;end;

//метод Наискорейшего спуска---}

//вычисление частной производной

function TMainForm.dFdX1(X1, X2: real): extended;

const d=1e-6;

begin Result:=F(X1+d,X2)/d-F(X1,X2)/d;end;

//вычисление частной производной

function TMainForm.dFdX2(X1, X2: real): extended;

const d=1e-6;

begin Result:=F(X1,X2+d)/d-F(X1,X2)/d;end;

//одномерная минимизация методом деления пополам

function TMainForm.MinX1(X1, X2: real): real;

var x,dx:real;

begin

x:=X1; dx:=Eps*200;

while Abs(dx)>=Eps/10 do

begin

dx:=-dx/2; while Myfunc(x+dx,X2)<Myfunc(x,X2) do x:=x+dx; end; Result:=x;

end;

//одномерная минимизация методом деления пополам

function TMainForm.MinX2(X1, X2: real): real;

var x,dx:real;

begin

x:=X2; dx:=Eps*200;

while Abs(dx)>=Eps/10 do

begin

dx:=-dx/2; while Myfunc(X1,x+dx)<Myfunc(X1,x) do x:=x+dx; end; Result:=x;

end;

//одномерный поиск второй точки с оптимальным шагом

function TMainForm.MinH(var X1, X2: real; x, y: real):boolean;

var work,dx,cosin,st:real;

i:integer;

begin

Result:=True;

if x=X1 then begin X1:=MinX1(X1,X2); Exit; end;

if y=X2 then begin X2:=MinX2(X1,X2); Exit; end;

cosin:=(y-X2)/(x-X1); st:=X2-cosin*X1; dx:=Eps*200; work:=X1;

while Hypot(dx,dx*cosin)>=Eps do begin dx:=-dx/2; i:=0;

while Myfunc(work+dx,(work+dx)*cosin+st)<Myfunc(work,work*cosin+st) do

begin Inc(i); work:=work+dx;

if (i mod 1000000)=0 then

begin

if MessageDlg('Экстремум не найден за '+IntToStr(i)+' итераций!'#13#10+

'Остановить выполнение программы?',mtWarning,[mbYes,mbNo],0)=mrYes then

begin

Result:=False; Exit; end; end; end; end;

X1:=work; X2:=work*cosin+st; end;

  1. Примеры работы метода:

1.

Решение задачи методом Наискорейшего спуска

Начальные данные: X1= -6,63507; X2= 4,18773; Eps= 0,1.

Х1

Х2

F(X1,X2)

H

-0,463195

3,12903412885242

44,8732579085609

6,26201868116105

-0,91241375

0,538663270212343

6,14484630544495

2,6290337903198

-0,0530387499999998

0,418707915262778

0,810255485768434

0,867706562039308

-0,13116375

0,0428498297084472

0,124330596637029

0,383891672352458

0,0250862500000002

0,0506453904827433

0,0229413491062387

0,156444345592245

-0,0139762499999998

0,0113995757491117

0,00157514286654455

0,0553724920908978

Задача решена за 6 шагов, 0,297 сек.

Решение: X1= -0,0139762499999998; X2= 0,0113995757491117; F(X1,X2)= 0,00157514286654455.

2.

Решение задачи методом Наискорейшего спуска

Начальные данные: X1= -0,58333; X2= 4,8191; Eps= 0,1.

X1

X2

F(X1,X2)

H

-1,4036425

1,03582051185311

15,3106320350931

3,8711905511211

-0,0755175000000001

0,691831951132841

2,22979870801267

1,37194903168135

-0,21223625

0,11163075246406

0,32789256184036

0,596091811332996

-0,0559862500000001

0,097465730836423

0,0507465618577276

0,156890759248948

0,0221387499999999

0,0184637759109715

0,00399048944115674

0,139796874642083

0,0221387499999999

-0,0184637759109715

0,00399048944115674

0

Задача решена за 6 шагов, 0,281 сек.

Решение: X1= 0,0221387499999999; X2= -0,0184637759109715; F(X1,X2)= 0,00399048944115674.

3.

Решение задачи методом Наискорейшего спуска

Начальные данные: X1= 3,75; X2= 3,05355; Eps= 0,1.

X1

X2

F(X1,X2)

H

-0,3125

0,491893585900866

1,37617951687598

4,80270651132205

0,0390625

0,0665359449363643

0,0447384324891814

0,551838123124106

0

0,0305215249937772

0,00465781743972884

0,0531311335287608

Задача решена за 3 шага, 0,266 сек.

Решение: X1= 0; X2= 0,0305215249937772; F(X1,X2)= 0,00465781743972884.

4.

Решение задачи методом Наискорейшего спуска

Начальные данные: X1= -6,95833; X2= -2,21418; Eps= 0,1.

X1

X2

F(X1,X2)

H

-0,23958

0,579482752416376

1,58286000164463

7,27641073172334

-0,0637987500000001

0,0184418892524613

0,0295564824807185

0,587933582976235

0,0143262499999999

0,0242802913976109

0,00598097636280454

0,0783428526708626

Задача решена за 3 шага, 0,282 сек.

Решение: X1= 0,0143262499999999; X2= 0,0242802913976109; F(X1,X2)= 0,00598097636280454.

5.

Решение задачи методом Наискорейшего спуска

Начальные данные: X1= 3,4375; X2= -1,93343; Eps= 0,001.

X1

X2

F(X1,X2)

H

0,283593749999998

-1,56081045162981

11,0535052938291

3,17584161469313

0,438476562499998

-0,246577743323663

1,4096222392812

1,32332773612194

0,0369140624999979

-0,199166315805453

0,179829139521471

0,404351684633024

0,0556640624999979

-0,0313526188858004

0,0227219798382294

0,168857926594641

0,00488281249999789

-0,0253226929114579

0,0029023448987944

0,0511380030781272

0,0070312499999979

-0,00364229006073124

0,000359399788974236

0,0217865933881643

0,000781249999997895

-0,00311307581922754

4,36106558462099E-5

0,0062723654001828

0,000775146484372895

-4,46176451313823E-5

4,67842940611226E-6

0,00306846424438684

0,000775146484372895

-4,46176451313823E-5

4,67842940611226E-6

0

Задача решена за 9 шагов, 0,484 сек.

Решение: X1= 0,000775146484372895; X2= -4,46176451313823E-5; F(X1,X2)= 4,67842940611226E-6.

6.

Решение задачи методом Наискорейшего спуска

Начальные данные: X1= 3,4375; X2= -1,93343; Eps= 0,1.

X1

X2

F(X1,X2)

H

0,3125

-1,56422559240011

11,0599765290972

3,14673432221266

0,4296875

-0,222353160266861

1,34208592644463

1,3469797824301

0,0390625

-0,18941101355818

0,161994220667219

0,392011575919355

0,0537109375

0,00251917078452932

0,0236518776624781

0,192488369474671

0,0537109375

0,00251917078452932

0,0236518776624781

0

Задача решена за 5 шагов, 0,484 сек.

Решение: X1= 0,0537109375; X2= 0,00251917078452932; F(X1,X2)= 0,0236518776624781.

10

Соседние файлы в папке Метод Наискорейшего спуска