ich soll für die Uni ein Programm mit ViP-Lap (wie Matlab, nur dass manche Befehle gesperrt sind) zum Newton-Verfahren schreiben, das mir am Ende einen Plot ausgibt.
Hier einmal die genaue Aufgabe:
e) "Nutzen Sie die in Aufgabenteil a) implementierte Methode newton(f,df,x,tol,kmax) zur numerischen Berchnung der Nullstellen von F(z)=z^3-1.
Wählen Sie dafür 111 x 111 Startwerte z aus [-1.5,1.5] x [-1.5i, 1,5i], eine Abbruchtoleranz tol=10^-8 und kmax=1000.
Untersuchen Sie, gegen welche der drei Nullstellen das Newton-Verfahren in Abhängigkeit von z konvergiert und stellen Sie alle Startwerte in einer gemeinsamen Grafik jeweils in der Farbe der Nullstelle dar, gegen die das Newton-Verfahren konvergiert."
Ich habe jetzt zwar einen funktionierenden Code, aber bei ViP-Lap bricht die Berechnung ab, wenn es länger als 20s dauert und mit meinem Code ist bei ca. 50 x 50 Startwerten Schluss, wähle ich mehr, dauert es zu lange...könnt ihr mir weiterhelfen, wie ich meinen Code schnell genug machen kann, damit es auch klappt, wenn die restlichen Aufgabenteile mit dabei sind und ich 111 x 111 Startwerte wähle?
Ich bin eine totale Anfängerin in Matlab und habe schon sehr lange für den untenstehenden Code gebraucht und ich hoffe, ihr könnt mir da weiterhelfen!
Code:
% a)-Teil function x = newton(f, df, x, tol, kmax) % Funktion
f;
% Ableitung (Jacobimatrix)
df;
% Startwert
x0=x;
% Abbruchtoleranz
tol;
% Maximale Anzahl an Iterationsschritten
kmax;
% Länge des Vektors x
n=length(x);
% Funktionsvektor
fx=zeros(1,n);
% Jacobimatrix
dfx=zeros(n,n);
% Implementierung des Newton-Verfahrens for k=1:kmax;
fx = f(x); dfx = df(x);
ifdet(dfx)==0;
end ifnorm(fx) < tol;
end
x = x - fx/dfx;
end end
% e)-Teil
f=@(z) z^3-1;
df=@(z)3*z^2;
% Nullstellen
z1=1;
z2=-0.5+(sqrt(3)/2)*i;
z3=-0.5-(sqrt(3)/2)*i;
for k=1:60 for l=1:60
x=-1.5-3/59+k*(3/59);
y=-1.5-3/59+l*(3/59);
z=x+i*y;
a=newton(@(z) z^3-1, @(z)3*z^2, z , 10e-8, 1000);
ifreal(a)-10e-8 <= 1 && real(a)+10e-8 >= 1 && imag(a)-10e-8 <= 0 && imag(a)+10e-8 >= 0 plot(x,y,'r .') hold on
end ifreal(a)-10e-8 <= -0.5 && real(a)+10e-8 >= -0.5 && imag(a)-10e-8 <= sqrt(3)/2 && imag(a)+10e-8 >= sqrt(3)/2 plot(x,y,'g .') hold on
end ifreal(a)-10e-8 <= -0.5 && real(a)+10e-8 >= -0.5 && imag(a)-10e-8 <= -sqrt(3)/2 && imag(a)+10e-8 >= -sqrt(3)/2 plot(x,y,'b .') end end end
mit dem Profiler lässt sich überprüfen, welche Programmteile am längsten brauchen. Dann kannst du dich auf die Verbesserung dieser Programmteile konzentrieren.
Oft ist das Plotten das langsame. Auch ein "hold on" in einer Schleife ist häufig ein Bremsklotz. Stattdessen könntest du wie von winkow vorgeschlagen das Plotten außerhalb der Schleife machen. Um dann die Farben richtig zu verwenden, kannst du logische Indizierung verwenden.
Kleines Beispiel dazu:
Code:
x = linspace(-pi, pi);
y = sin(x);
bed1 = y > 0.8;
bed2 = y < -0.8;
bed3 = ~(bed1 | bed2);
plot(x(bed1), y(bed1), 'bo') hold on
plot(x(bed2), y(bed2), 'go') plot(x(bed3), y(bed3), 'ro') hold off
Falls du Zugang zu MATLAB hast (in BaWü gibt es z.B. eine Landeslizenz), wäre das natürlich der deutlich einfachere Weg: keine künstlichen Einschränkungen bzgl. Laufzeit, Nutzbarkeit, und Befehlsumfang.
Hallo Conny_95,
in Deiner »newton«-Funktion machen alle Befehle vor dem »for« keinen Sinn. Entweder weil sie nichts machen (z.B. »tol;«) oder weil hier eine Preallocation der Matrizen unnötig ist, weil sie in der Schleife sowieso jedesmal neu erstellt werden (»fx=zeros«).
Um Zahlenraster zu erzeugen, gibt es »linspace« und »meshgrid«.
Warum definierst Du Dir vor den »for«-Schleifen Funktionen und Nullstellen, um sie dann in der »for«-Schleife nicht zu benutzen???
So testest Du, ob eine Lösung nahe an der Nullstelle ist »abs(z-z1)<1e-7«. Rechne am besten erst alle Nullstellen (z.B mit »arrayfun«) bestimme dann für die gesamte Lösungsmatrix die passenden Nullstellen und stelle das Ergebnis mit »imagesc« dar. Braucht <5s.
Vielen Dank für eure Antworten, dann versuche ich mal mein Bestes :)
Mfg,
Caro
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.