WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Newton-Verfahren, Code schneller machen

 

Conny_95
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 02:42     Titel: Newton-Verfahren, Code schneller machen
  Antworten mit Zitat      
Hallo ihr Lieben,

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);
   if det(dfx)==0;
   end
   if norm(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);
   if real(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
   if real(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
   if real(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

 


Mfg,
Conny
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.01.2014, 09:17     Titel:
  Antworten mit Zitat      
Code:
if det(dfx)==0;
end
if norm(fx) < tol;
end

die beiden zeilen machen nix und fressen daher nur zeit.
vieleicht meinst du
Code:
.
weiterhin würde ich unten das plotten aus der schleife rausnehmen. erst die werte alle speichern und dann danach plotten.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.01.2014, 10:17     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 10:58     Titel:
  Antworten mit Zitat      
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.

null.png
 Beschreibung:

Download
 Dateiname:  null.png
 Dateigröße:  906 Bytes
 Heruntergeladen:  450 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Conny_95
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 16:01     Titel:
  Antworten mit Zitat      
Vielen Dank für eure Antworten, dann versuche ich mal mein Bestes :)

Mfg,
Caro
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.