Maciej Pawnuk, Tomasz Imiołek.
Minimalizacja na kierunku
Rozwiązanie analityczne
Obliczam gradient
G=
=
Obliczam punkty podejrzane
Rozwiązaniem układu jest:
Obliczam Hesjan
H=
Obliczam wyznacznik hesjana
det(H)= 42.2566
det(H)>0 ---> minimum
punkt
to minimum funkcji.
Metoda Gaussa-Saidla
Kod programu:
Zloty podział:
function z = zloty_podzial(x,baza,e)
a = -1000;
b = 1000;
X = [b - (b-a)*(sqrt(5)-1)/2;a+(b-a)*(sqrt(5)-1)/2];
f=[funkcja(x+X(1)*baza);funkcja(x+X(2)*baza)];
while b-a>e*0.001
if f(1)>f(2)
a=X(1);
X(1)=X(2);
X(2)=a+(b-X(1));
else
b=X(2);
X(2)=X(1);
X(1)=a+(b-X(2));
end
f=[funkcja(x+X(1)*baza);funkcja(x+X(2)*baza)];
if f(1)>f(2)
z=X(2);
else
z=X(1);
end
if z - e < a && z + e > a
a = a - 500;
b = b - 500;
end
if z + e > b && z - e < b
b = b + 500;
a = a + 500;
end
end
Gauss:
function gauss(x,e)
baza=[1 0 0;0 1 0;0 0 1];
i=0;
odl=10;
while odl>e
xp=x;
x=x+baza(:,1)*zloty_podzial(x,baza(:,1),e);
x=x+baza(:,2)*zloty_podzial(x,baza(:,2),e);
x=x+baza(:,3)*zloty_podzial(x,baza(:,3),e);
odl=sqrt(((xp(1)-x(1))^2)+((xp(2)-xp(2))^2)+((xp(3)-x(3))^2));
i=i+ 1
f=funkcja(x)
x
odl
end
Funkcja:
function f=funkcja(x)
f= 2*x(1)^2+2*x(2)^2+3*x(3)^2+1.9643*x(1)*x(2)-1.7347*x(1)*x(3)+1.4643*x(2)*x(3)-8*x(1)-8*x(2)-24*x(3)+98;
Tabele Wyników:
Dla X=[1;1;1] (punkt bliski minimum)
dokładność |
X |
f(X) |
iteracje |
odległość |
1 |
5.4805 -2.7570 6.5190 |
4.5477 |
4 |
0.8290 |
0.1
|
6.9133 -3.9272 6.9785 |
2.0080 |
9 |
0.0727 |
0.01
|
6.9898 -3.9939 6.9953 |
1.9990 |
13 |
0.0099 |
0.001 |
6.9991 -3.9993 6.9997 |
1.9989 |
18 |
6.0760e-004 |
0.0001 |
7.0001 -4.0001 7.0001 |
1.9989 |
23 |
4.1513e-005 |
dokładność |
X |
f(X) |
iteracje |
odległość |
1 |
8.4924 -4.9229 7.8818 |
4.3091 |
12 |
0.7533 |
0.1
|
7.1320 -4.1053 7.0799 |
2.0171 |
17 |
0.0934 |
0.01
|
7.0128 -4.0063 7.0069 |
1.9991 |
21 |
0.0099 |
0.001 |
7.0016 -4.0015 7.0009 |
1.9989 |
26 |
7.0514e-004 |
0.0001 |
7.0002 -4.0002 7.0001 |
1.9989 |
31 |
6.7187e-005 |
Dla X=[100;100;100] (punkt daleki minimum)
Metoda najszybszego spadkuWynikówSaidlahesjana
Kod programu:
Zloty podzial:
function z = zloty_podzial(x,g,e)
a = -100;
b = 100;
z=b;
xn=[b-(b-a)*(sqrt(5)-1)/2; a+(b-a)*(sqrt(5)-1)/2];
f= [funk(x-xn(1)*g);funk(x-xn(2)*g)];
while norm(b-a)>0.01*e
if f(1)>f(2)
a=xn(1);
xn(1)=xn(2);
xn(2)=a+(b-xn(1));
else
b=xn(2);
xn(2)=xn(1);
xn(1)=a+(b-xn(2));
end
f = [funk(x-xn(1)*g);funk(x-xn(2)*g)];
end
if f(1)>f(2)
z = xn(2);
else
z = xn(1);
end
if z - e < a & z + e > a
a = a - 500;
end
if z + e > b & z - e < b
b = b + 500;
end
end
Gradient:
function g=gradient(x)
g(1) = 4*x(1)+1.9643*x(2)-1.7347*x(3)-8;
g(2) = 1.9643*x(1)+4*x(2)+1.4643*x(3)-8;
g(3) = -1.7347*x(1)+1.4643*x(2)+6*x(3)-24;
g=[g(1);g(2);g(3)]
Funkcja:
function f = funkcja(x)
f= 2*x(1)^2+2*x(2)^2+3*x(3)^2+1.9643*x(1)*x(2)-1.7347*x(1)*x(3)+1.4643*x(2)*x(3)-8*x(1)-8*x(2)-24*x(3)+98;
Spadek:
function i=spadek(x,E)
i=0;
stop=0;
while stop==0
i = i+1;
x = x - zloty_podzial(x,gradient(x),E)*gradient(x);
stop = norm(gradient(x))<E ;
end
end
Tabele wyników:
dokładność |
X |
f(X) |
iteracje |
1
|
6.6382 -3.6605 6.8261 |
2.1452 |
9 |
0.1
|
6.9537 -3.9566 6.9777 |
2.0013 |
15 |
0.01
|
6.9971 -3.9973 6.9986 |
1.9989 |
23 |
0.001
|
6.9997 -3.9998 6.9999 |
1.9989 |
29 |
0.0001
|
7.0001 -4.0001 7.0001 |
1.9989 |
35 |
Dla X=[1;1;1] (punkt bliski minimum)
dokładność |
X |
f(X) |
iteracje |
1
|
7.3968 -4.3914 7.2957 |
2.1452 |
10 |
0.1
|
7.0310 -4.0306 7.0232 |
2.0001 |
16 |
0.01
|
7.0057 -4.0056 7.0042 |
1.9989 |
20 |
0.001
|
7.0005 -4.0005 7.0004 |
1.9989 |
26 |
0.0001
|
7.0002 -4.0002 7.0001 |
1.9989 |
32 |
Dla X=[100;100;100] (punkt daleki minimum)
Wnioski:
Z naszych wyników można wywnioskować, że metoda Gaussa-Seida jest bardziej efektywna (potrzeba mniej iteracji do osiągnięcia wyniku) niż metoda najszybszego spadku. Jednakże metoda ta jest bardziej zależna od punktu startowego(im dalej tym więcej iteracji) dlatego gdy nie wiemy gdzie mniej więcej będzie znajdować się minimum lepszym wyborem staje się metoda najszybszego spadku.
wykres zależności dokładności a ilości iteracji.