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

Lösung nichtlinearer Gleichungssysteme durch Newton-Verfahr

 

l4grange
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2013, 23:02     Titel: Lösung nichtlinearer Gleichungssysteme durch Newton-Verfahr
  Antworten mit Zitat      
Hallo,

Ich habe die Aufgabe, das Newton-Verfahren in Matlab zu implementieren. Das ganze soll mit zwei oder mehreren Gleichungen (also im \mathbb R^{n} ) funktionieren.

Hier meine bisherige Funktion zum Newton-Verfahren:

Code:
function [x,fx,it] = newtonIteration(fun,dfun,x0,tol,nmax)
    %NEWTONITERATION Findet approximierte Nullstelle in der Nähe des Startwerts.
   
    %Zu übergebende Parameter:
    %fun: Funktion
    %dfun: Ableitung der Funktion
    %x0: Startwert
    %tol: Toleranz
    %nmax: maximale Anzahl Iterationsschritte
   
    %Rückgabe:
    %x: approximierte Nullstelle
    %fx: Funktionswert an Stelle x
    %it: Anzahl benötigter Iterationen    
   
    x=x0;
    it=0;
    a=1+tol;
    while a>tol && it<nmax
        xtemp=-((dfun(x))^-1)*fun(x)+x;
        a=norm(xtemp-x);
        x=xtemp;
        it=it+1;
    end
    fx=fun(x);
end


Ich führe die Funktion mit folgendem Code-Stück aus:

Code:
clear all
fun=@ (x) [6*x(1)-cos(x(1))-2*x(2) ; 8*x(2)-x(1)*x(2)^2-sin(x(1))];%Funktionen gemäss Aufgabe
dfun=@ (x) [6+sin(x(1)) , -2 ; x(2)^2-cos(x(1)) , 8-2*x(1)*x(2)];%Abgeleitete Funktionen
x0=[5 ; 5];%Startvektor der Iteration [ ]
tol=10^-6;%gewünschte Toleranz
nmax=20;%maximale Anzahl der Iterationen
[x,fx,it] = newtonIteration(fun,dfun,x0,tol,nmax)%Vorgegebene Matlab-Funktion Newton Iteration
 



Die übergebenen Funktionen sind in der Aufgabenstellung vorgegeben, genau wie die Argumente und Rückgabewerte der Funktion newtonIteration.

Jetzt zum eigentlichen Problem: Gemäss Wolfram Alpha besitzt das Gleichungssystem mindestens zwei Lösungen:

x1 = 0.171334, x2 =0.0213218
x1 =1.60865, x2 = 4.84489

Mit der von mir erstellten Funktion erhalte ich aber nur die Lösung (x1 = 0.171334, x2 =0.0213218), unabhängig davon, welche Startwerte ich für x0 wähle.

Hat jemand eine Idee, was ich falsch mache?
Ach ja, die Rückgabe von fx stimmt glaube ich auch noch nicht, aber damit befasse ich mich dann, wenn ich alle Nullstellen habe.

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.11.2013, 23:29     Titel:
  Antworten mit Zitat      
Hallo,

ich habe die zweite Lösung mit fsolve mal etwas genauer berechnet, mit der von dir angegebenen zweiten Lösung als Startwert
Code:
[x0_2,fval] = fsolve(fun, x0)

1.608653898076899
4.844885958753324

Wenn du das als Startwert in deine Funktion fütterst, kommt auch wieder dasselbe heraus. Meine Vermutung ist, dass die erste Lösung einfach einen relativ großen "Einzugsbereich" hat, was die Konvergenz zu dieser Lösung angeht.
Vielleicht hilft es ja, wenn du das ganze mal plottest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
l4grange
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2013, 15:55     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke erstmal für die schnelle Antwort.
Tatsächlich, wenn ich die exakte Nullstelle einsetze, kommen auch die fehlenden Nullstellen raus.

Zu deiner Erläuterung mit dem Einzugsbereich habe ich allerdings noch eine Frage: Wenn ich als Startwert x0 = (2, 5) wähle, dann müsste ja trotz des Einzugsbereiches die Nullstelle (1.608653898076899, 4.844885958753324) herauskommen, oder? Sonst würde das Verfahren diese Lösung ja einfach überspringen.

Hast Du ausserdem eine Idee, wie ich das ganze so plotten kann, dass es mir das Problem ersichtlich macht? Das habe ich leider nicht ganz auf die Reihe gekriegt.

Danke und Gruss
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2013, 16:45     Titel:
  Antworten mit Zitat      
Hallo,

Plotten:
Code:
[x1, x2] = meshgrid(-6:0.1:6, -5:0.1:5);
fun=@ (x) norm([6*x(1)-cos(x(1))-2*x(2) ; 8*x(2)-x(1)*x(2)^2-sin(x(1))]);
z = arrayfun(@(x1, x2) fun([x1, x2]), x1, x2);
contour(x1,x2,z, 10.^(-1:2), 'ShowText', 'on')


Zitat:
Sonst würde das Verfahren diese Lösung ja einfach überspringen.

Wohl weniger überspringen, sondern außen herumlaufen. Du kannst dir ja mit quiver mal die Gradienten ansehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
l4grange
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2013, 19:00     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke für Deine Hilfe. Ich glaube ich sehe das Problem mittlerweile deutlicher.

Ich hoffe, ich habe Dich richtig verstanden und fasse nochmals zusammen:

- Meine Matlab-Funktion stimmt soweit und funktioniert wie vorgesehen
- Daran, dass man die fehlenden Nullstellen nur durch einen sehr exakt gewählten Startwert erreichen kann, kann man mit dem Newton-Verfahren nichts ändern. Das liegt in der Gegebenheit der Aufgabe.

Danke für ein kurzes Feedback und/oder eine Korrektur! Wink

Gruss
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2013, 21:34     Titel:
  Antworten mit Zitat      
Hallo,

ja, das wäre meine Interpretation. Natürlich ist nicht garantiert, dass die richtig ist :)
Wenn jedoch ein Fehler in der Funktion wäre, würde sie wohl nie zu einer richtigen Lösung konvergieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
l4grange
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 05.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2013, 21:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

Fehler gefunden - ich habe bei der Ableitung ein Minus vergessen Shocked !
Nächstes mal kontrolliere ich die offensichtlichen Sachen als erstes Wink

Ansonsten funktioniert die Funktion jetzt wie gewünscht!

Gruss
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.