Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchet_spets_kurs_Mozharovsky.doc
Скачиваний:
9
Добавлен:
18.09.2019
Размер:
697.86 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение образования

«Гомельский государственный университет имени Франциска Скорины»

Математический факультет

ОТЧЁТ

по лабораторным работам по дисциплине

«Численные методы решения экстремальных задач»

Выполнил: студент группы ПМ-33 Соколов В.В.

Проверил: Можаровский В.В.

Гомель, 2012

Лабораторная работа №1

Найти минимум функции методом Золотого Сечения, Фибоначчи и деления пополам:

F(x) = x*0.8 +

Программа:

program lab_1_1;

uses crt;

var

phi,a,b,eps,x1,x2,y1,y2: double;

k: INTEGER;

function f(x:double):double;

begin

f:=x*0.8+exp(abs(x-1.8));

end;

function min(a:double;b:double):double;

begin

if a<b then min:=a

else min:=b;

end;

begin

clrscr;

writeln('Laboratornaya rabota 1');

phi:=(1+sqrt(5))/2;

write('vvod a ->');

readln(a);

write('vvod b ->');

readln(b);

write('vvod eps ->');

readln(eps);

writeln;

x1:=b-(b-a)/phi;

x2:=a+(b-a)/phi;

y1:=f(x1);

y2:=f(x2);

{___________________________________________}

{metod zolotogo sechenia}

k:=0;

while abs(b-a)>eps do

if y1<=y2 then

begin

k:=k+1;

b:=x2;

x2:=x1;

x1:=b-(b-a)/phi;

y2:=y1;

y1:=f(x1);

end

else

begin

k:=k+1;

a:=x1;

x1:=x2;

x2:=a+(b-a)/phi;

y1:=y2;

y2:=f(x2);

end;

writeln('Rezult method Zolotogo Secheniya: ');

writeln('x--> ',min(x1,x2):8:4,' y--> ',f(min(x1,x2)):8:4);

writeln('Kol-vo iteraciq ',k);

{___________________________________________}

readln;

end.

Результат:

Программа:

program lab_1_2;

uses crt;

var

phi,a,b,x1,x2,y1,y2,q,k: double;

function f(x:double):double;

begin

f:=x*0.8+exp(abs(x-1.8));

end;

function min(a:double;b:double):double;

begin

if a<b then min:=a

else min:=b;

end;

begin

clrscr;

writeln('Laboratornaya rabota 1');

phi:=(1+sqrt(5))/2;

write('vvod a ->');

readln(a);

write('vvod b ->');

readln(b);

write('vvod q ->');

readln(q);

writeln;

x1:=b-(b-a)/phi;

x2:=a+(b-a)/phi;

y1:=f(x1);

y2:=f(x2);

{___________________________________________}

{metod fibonachchi}

Begin

k:=q;

while q<>1 do

begin

if y1<=y2 then

begin

b:=x2;

x2:=x1;

x1:=b-(b-a)/phi;

y2:=y1;

y1:=f(x1);

end

else

begin

a:=x1;

x1:=x2;

x2:=a+(b-a)/phi;

y1:=y2;

y2:=f(x2);

end;

q:=q-1;

end;

writeln('Rezalt method Fibonachi: ');

writeln('x-> ',min(x1,x2):8:4,' y-> ',f(min(x1,x2)):8:4);

writeln('Kol-vo iteraciq ',k:6:0);

End;

{__________________________________________}

readln;

end.

Результат:

Программа:

program lab_1_3;

uses crt;

var

phi,a,b,eps,x1,y1: double;

c:real;

k: INTEGER;

function f(x:double):double;

begin

f:=x*0.8+exp(abs(x-1.8));

end;

function min(a:double;b:double):double;

begin

if a<b then min:=a

else min:=b;

end;

begin

clrscr;

writeln('Laboratornaya rabota 1');

phi:=(1+sqrt(5))/2;

write('vvod a ->');

readln(a);

write('vvod b ->');

readln(b);

write('vvod eps ->');

readln(eps);

writeln;

x1:=b-(b-a)/phi;

y1:=f(x1);

{___________________________________________}

{metod delpopolam}

k:=0;

while (b-a)>eps do

begin

c:=(a+b)/2;

if f(a)*f(c)<0 then

begin

k:=k+1;

b:=c;

end

else

begin

k:=k+1;

a:=c;

end;

x1:=min(a,b);

end;

writeln('Rezult method delenia popolam: ');

writeln('x-> ',x1:8:4,' y-> ',f(x1):8:4);

writeln('Kol-vo iteraciq ',k);

{___________________________________________}

readln;

end.

Результат:

Лабораторная работа №2

Найти минимум функции методом Хука-Дживса:

График:

Программа:

program HuDj;

uses crt;

label 0,1,2,3,4,5,6,7;

var k,h,z,ps,bs,fb,fi :real;

i,j,n,fe :integer;

x,y,b,p :array[1..10] of real;

(*** Процедура,вычисляющая функцию ***)

procedure calculate;

begin

z:=sqr(sqr(x[1]))+sqr(sqr(x[2]))+2*sqr(x[1]*x[2])-4*x[1]+3;

fe:=fe+1; (*** Счетчик ***)

end;

begin

clrscr;

gotoxy(20,2);

writeln('Минимизация функции методом Хука-Дживса');

writeln;

writeln('Введите число переменных:');

readln(n);

writeln;

writeln('Введите начальную точку: ');

for i:=1 to n do

readln(x[i]);

writeln;

writeln('Введите длину шага');

readln(h);

writeln;

k:=h;

fe:=0;

for i:=1 to n do

begin

y[i]:=x[i];

p[i]:=x[i];

b[i]:=x[i];

end;

calculate;

fi:=z;

writeln('Начальное значение функции', z:2:3);

for i:=1 to n do

writeln(x[i]:2:3);

ps:=0;

bs:=1;

(*** Исследование вокруг базисной точки ***)

j:=1;

fb:=fi;

0: x[j]:=y[j]+k;

calculate;

if z<fi then goto 1;

x[j]:=y[j]-k;

calculate;

if z<fi then goto 1;

x[j]:=y[j];

goto 2;

1: y[j]:=x[j];

2: calculate;

fi:=z;

writeln('Пробный шаг',' ', z:2:3);

for i:=1 to n do

writeln(x[i]:2:3);

if j=n then goto 3;

j:=j+1;

goto 0;

3: if fi<fb-1e-08 then goto 6;

(*** После оператора 3,если функция не уменьшилась, ***)

(*** произвести поиск по образцу ***)

if (ps=1) and (bs=0) then

goto 4;

(*** Но если исследование производилось вокруг точки ***)

(*** шаблона PT,и уменьшение функции не было достигнуто,***)

(*** то изменить базисную точку в операторе 4: ***)

(*** в противном случае уменьшить длину шага в операторе***)

(*** 5: ***)

goto 5;

4: for i:=1 to n do

begin

p[i]:=b[i];

y[i]:=b[i];

x[i]:=b[i];

end;

calculate;

bs:=1;

ps:=0;

fi:=z;

fb:=z;

writeln('Замена базисной точки',' ',z:2:3);

for i:=1 to n do

writeln(x[i]:1:3);

(*** (следует за последним комментарием) ***)

(*** и провести исследование вокруг новой базисной точки ***)

j:=1;

goto 0;

5: k:=k/10;

writeln('Уменьшить длину шага');

if k<1e-08 then goto 7;

(*** Если поиск незакончен,то произвести новое ***)

(*** исследование вокруг новой базисной точки ***)

j:=1;

goto 0;

(*** Поиск по образцу ***)

6: for i:=1 to n do

begin

p[i]:=2*y[i]-b[i];

b[i]:=y[i];

x[i]:=p[i];

y[i]:=x[i];

end;

calculate;

fb:=fi;

ps:=1;

bs:=0;

fi:=z;

writeln('Поиск по образцу',' ',z:2:3);

for i:=1 to n do

writeln(x[i]:2:3);

(*** После этого произвести исследование вокруг ***)

(*** последней точки образца ***)

j:=1;

goto 0;

7: writeln('Минимум найден');

for i:=1 to n do

writeln('x(',i,')=',p[i]:2:3);

writeln;

writeln('Минимум функции равен',' ',fb:2:3);

writeln('Количество вычислений функции равно',' ',fe);

repeat until keypressed;

end.

Результат:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]