Optimierung mittels modifizierter Gradientenverfahren
vorlesung_2013_12_17.zip - Beispiel-Implementierung des modifizierten Gradientenverfahrens mit Java als BlueJ-Projekt.
|
Bild 0-1: z = x3-4*x+y3-16*y für -3>x>3, -3>y>3.
|
function z=f(x,y)
z = x^3-4*x+y^3-16*y
endfunction
x=-3:0.1:3;
y=x;
fplot3d(x,y,f,alpha=5,theta=31);
Code 0-1: Scilab-Skript, um den Graph der Funktion z = x3-4*x+y3-16*y zu erstellen.
|
function z=f(x,y)
z = x^3-4*x+y^3-16*y
endfunction
//Suchen ausgehend von einem aktuellen Punkt in Richtung [xricht,yricht] nach dem kleinsten Wert
//für die übergebene Funktion funk.
function alfabest=frichtung(x,y,xricht,yricht,funk)
alfa = [-2.0,-1.0,-0.5,0.5,1.0,2.0];
wert_best = funk(x+alfa(1)*xricht,y+alfa(1)*yricht);
alfa_best = alfa(1);
for i=2:6
wert = funk(x+alfa(i)*xricht,y+alfa(i)*yricht);
if wert < wert_best
wert_best = wert;
alfa_best = alfa(i);
end
end
alfabest = alfa_best;
endfunction
//Matrix mit Einheitsvektoren U=[ex,ey] geben zu Beginn
//Suchrichtung vor:
U=[[1;0],[0;1]]
z=[4;4];
znull=z;
for i=1:15
alfax = frichtung(z(1,1),z(2,1),U(1,1),U(2,1),f);
alfay = frichtung(z(1,1),z(2,1),U(1,2),U(2,2),f);
//Neuen Punkt in die Richtung setzen, die den größten Abstieg liefert:
wertx = f(z(1,1)+alfax*U(1,1),z(2,1)+alfax*U(2,1));
werty = f(z(1,1)+alfay*U(1,2),z(2,1)+alfay*U(2,2));
if wertx < werty
z(1,1) = z(1,1) + alfax*U(1,1);
z(2,1) = z(2,1) + alfax*U(2,1);
else
z(1,1) = z(1,1) + alfay*U(1,2);
z(2,1) = z(2,1) + alfay*U(2,2);
end
U(:,1) = alfax*U(:,1);
U(:,2) = alfax*U(:,2);
z=z
fehler = abs(z(1)-2/sqrt(3))+abs(z(2)-4/sqrt(3))
end
Code 0-1: Beispiel für die Anwendung eines konkreten modifizierten Gradientenverfahrens am Beispiel der Funktion z = x3-4*x+y3-16*y.
|
function z=f(x,y)
z = x^3-4*x+y^3-16*y
endfunction
function alfabest=frichtung(x,y,xricht,yricht,funk)
alfa = [-2.0,-1.0,-0.5,0.5,1.0,2.0];
wert_best = funk(x+alfa(1)*xricht,y+alfa(1)*yricht);
alfa_best = alfa(1);
for i=2:6
wert = funk(x+alfa(i)*xricht,y+alfa(i)*yricht);
if wert < wert_best
wert_best = wert;
alfa_best = alfa(i);
end
end
alfabest = alfa_best;
endfunction
U=[[1;0],[0;1]]
z=[4;4];
znull=z;
for i=1:15
betrag=1.0;
alfax = frichtung(z(1,1),z(2,1),U(1,1),U(2,1),f);
alfay = frichtung(z(1,1),z(2,1),U(1,2),U(2,2),f);
//Neuen Punkt setzen:
wertx = f(z(1,1)+alfax*U(1,1),z(2,1)+alfax*U(2,1));
werty = f(z(1,1)+alfay*U(1,2),z(2,1)+alfay*U(2,2));
if wertx < werty
z(1,1) = z(1,1) + alfax*U(1,1);
z(2,1) = z(2,1) + alfax*U(2,1);
betrag = norm(alfax*U(:,1));
else
z(1,1) = z(1,1) + alfay*U(1,2);
z(2,1) = z(2,1) + alfay*U(2,2);
betrag = norm(alfay*U(:,2));
end
U(:,1) = alfax*U(:,1);
U(:,2) = alfax*U(:,2);
//Konjugierte Richtung einsetzen:
if wertx < werty
if abs((z-znull)'*U(:,1))<abs((z-znull)'*U(:,2))
U(:,2)=U(:,1);
end
U(:,1) = betrag*(z-znull)/norm(z-znull);
end
z=z
fehler = abs(z(1)-2/sqrt(3))+abs(z(2)-4/sqrt(3))
end
Code 0-2: Implementierung eines modifizierten Gradientenverfahrens unter Verwendung konjugierter Richtungsvektoren nach Powell.