Optimierung mittels modifizierter Gradientenverfahren
|

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.