Программирование / 1234(что нашла катик) / Метод Наискорейшего спуска / Практика_3
.docМинистерство образования и науки Российской Федерации
Пермский государственный технический университет
Кафедра ИТАС
Практическая работа №3.
Многомерные методы прямого поиска
(метод Наискорейшего спуска).
Вариант №1.
Выполнила студентка Дьякова О.Р.
Группа АСУ-02-2.
Принял Гольдштейн А.Л.
Пермь 2005
-
Постановка задачи:
Нахождение минимума функции 8 * Х12 + 4 * Х1 *Х2 + 5 * Х2 2 методом Наискорейшего спуска.
-
Листинг программы:
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.
Решение задачи методом Наискорейшего спуска
Начальные данные: 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.