next up previous contents
Nächste Seite: M-Files zu den Differentialgleichungen Aufwärts: M-Files zu den Funktionen Vorherige Seite: Höhenlinien-Plots   Inhalt

Mehrdimensionales Newton-Verfahren

Ein Einzelschritt der Newton-Iteration zum Invertieren der Kugelfunktion wird im File 'kugjacrun.m' gezeigt. Zum Iterieren muss dieses Skript mehrfach aufgerufen werden.

% kugjacrun.m 3D Newton Iteration
xstart = [5 0.5 0.3]';
xaktuell = xstart
for iter = 1:8
ferr = kugfct(xaktuell)
delx = -kugjac(xaktuell)\ferr
xaktuell = xaktuell + delx
pause
end
Dabei werden die Funktionen 'kugfct.m' und 'kugjac.m' aufgerufen.

% fvec=kugfct(xvec) Abweichungen bei Kugelfunktions-Iteration 
function fvec = kugfct(xvec)
fvec = zeros(3,1);
fvec(1) = xvec(1)*cos(xvec(2))*cos(xvec(3)) - 2;
fvec(2) = xvec(1)*cos(xvec(2))*sin(xvec(3)) - 7;
fvec(3) = xvec(1)*sin(xvec(2)) - 3;

% Jkug = kugjac(xvec) Jacobi Matrix zu Kugelkoordinaten
function Jkug = kugjac(xvec)
Jkug = zeros(3);
rac = xvec(1); tac = xvec(2); wac = xvec(3);
Jkug(1,1)=     cos(tac)*cos(wac); 
Jkug(1,2)= -rac*sin(tac)*cos(wac);
Jkug(1,3)= -rac*cos(tac)*sin(wac);
Jkug(2,1)=     cos(tac)*sin(wac); 
Jkug(2,2)= -rac*sin(tac)*sin(wac);
Jkug(2,3)=  rac*cos(tac)*cos(wac);
Jkug(3,1)=     sin(tac); 
Jkug(3,2)=  rac*cos(tac);
Jkug(3,3)=     0 ;

Im File 'funkfeuer.m' zur Lösung der Übung 60 - 33 sind die beiden Funktionen zur Evaluation der Abweichungen und zur Bestimmung der Jacobimatrix als Unterfunktionen definiert. Dazu muss die Hauptfunktion aber selbst eine Funktion sein, ein Skript ist nicht erlaubt.

%[x,y]= funkfeuer(d1,d2) 2D Newton Iteration 
function [xpos,ypos] = funkfeuer(d1,d2)
xv = [5 5]'; dv = [d1;d2];

for iter =1:8
dx = funkfeuerjac(xv)  \ funkfeuerfct(xv,dv);
xv = xv -dx;
end
xpos = xv(1); ypos = xv(2);

% subfunction funkfeuerfct
function fmom = funkfeuerfct(xv,dv)
fmom=zeros(2,1);
fmom(1) = sqrt(xv(1)^2+xv(2)^2) - ...
     sqrt(xv(1)^2+(xv(2)-10)^2) - dv(1); 
fmom(2) = sqrt(xv(1)^2+xv(2)^2) -  ...
      sqrt((xv(1)-10)^2+xv(2)^2) - dv(2); 

% subfunction funkfeuerjac
function jbk = funkfeuerjac(xv)
jbk(1,1) = xv(1)/sqrt(xv(1)^2+xv(2)^2) - ...
     xv(1)/sqrt(xv(1)^2+(xv(2)-10)^2);
jbk(1,2) = xv(2)/sqrt(xv(1)^2+xv(2)^2) - ...
     (xv(2)-10)/sqrt(xv(1)^2+(xv(2)-10)^2);
jbk(2,1) = xv(1)/sqrt(xv(1)^2+xv(2)^2) - ...
     (xv(1)-10)/ sqrt((xv(1)-10)^2+xv(2)^2);
jbk(2,2) = xv(2)/sqrt(xv(1)^2+xv(2)^2) - ...
     xv(2)/ sqrt((xv(1)-10)^2+xv(2)^2);



Stefan Adam 2006-03-07