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

 

Zuckerstange
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 14:21     Titel: Lösung nichtlinearer Gleichungssysteme durch Newton-Verfahr
  Antworten mit Zitat      
Hallo,
ich bin ein Matlab Neuling und habe folgende Aufgabe:

Gesucht ist die Nullstelle des nichtlinearen Gleichungssystems

f(x,y)= x²+y²+0,6y-0,16=0
g(x,y)= x²-y²+x-1,6y-0,14=0

Die Iteration soll mit einer while-Schleife realisiert werden und abgebrochen werden wenn die euklidische Norm des Residuums kleiner als die vorgegebene Toleranz ist oder die maximale Anzahl der zulässigen Iterationen NMax erreich ist.

Toleranz: 10^-6
NMax = 20
Startnäherung: x0=0,6 ; y0=0,25


Hier ist meine Funktion:

Code:
%
function [ x ] = newton( x0,y0,TOL,NMax )
%UNTITLED Berechnung der Nullstellen


    %Zu übergebende Parameter:
    %fun: Funktion
    %dfun: Ableitung der Funktion
    %x0: Startwert x
    %y0: Startwert y
    %TOL: Toleranz
    %NMax: maximale Anzahl Iterationsschritte
   
    %Rückgabe:
    %x: approximierte Nullstelle
    %fx: Funktionswert an Stelle x
    %k: Anzahl benötigter Iterationen
 
   x=x0;
   k=0;
   a=1+TOL;
    while a>TOL && k<NMax
        xtemp=-((dfun(x))^-1)*fun(x)+x;
        a=norm(xtemp-x);
        x=xtemp;
        k=k+1;
    end
    fx=fun(x);
end
 


Ich führe die Funktion mit folgendem Befehl aus:

Code:
%
fun=@ (x) [x^2+y^2+0.6y-0.16];[x^2-y^2+x-1.6y-0.14];%Funktionen gemäss Aufgabe
dfun=@ (x) [2x+2y+0.6;2x-2y+1-1.6];%Abgeleitete Funktionen
x0=[0.6 ; 0.25];%Startvektor der Iteration [ ]
TOL=10^-6;%gewünschte Toleranz
nmax=20;%maximale Anzahl der Iterationen
[ x ] = newton( x0,y0,TOL,NMax )%Vorgegebene Matlab-Funktion Newton Iteration
 


Ich bekomme die Fehlermeldung "Zu wenige Input Argumente". Ich wäre wirklich sehr dankbar wenn mir jemand sagen könnte wo mein Fehler liegt.

Vielen Dank Smile
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: 15.02.2015, 14:29     Titel:
  Antworten mit Zitat      
funktionen haben ihreren eigenen variablen raum. wenn du variablen nicht übergiebst sind sie da auch nicht bekannt. die anonymen funktionen fun und dfun sollten also in der funktion newton unbekannt sein. außerdem glaube ich nicht das "Zu wenige Input Argumente" die vollständige fehlermeldung ist.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Zuckerstange
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 14:36     Titel:
  Antworten mit Zitat      
Könntest du das noch etwas genauer erläutern?
Ich programmiere zum Ersten Mal Wink

Die genaue Fehlermeldung ist:

Error using newton ( line 18 )
Not enough input arguments.

Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 19:41     Titel:
  Antworten mit Zitat      
Moin,

der Fehler kommt, weil du schreibst
Code:
fun=@ (x) [x^2+y^2+0.6*y-0.16];[x^2-y^2+x-1.6*y-0.14]; %Funktionen gemäss Aufgabe


Den 2. Term soll doch an 2. Stelle des Vektors fun sein, so wie du das schreibst machst du dafür einen neuen "Vektor". (Und vor dem 2. ungewollten Vektor ist kein @(x,y) davor, deshalb spuckt er die Fehlermeldung "kenne Variable x im 2. Vektor nicht" aus.)
Desweiteren muss man ein Malzeichen zwischen Variable und Faktor setzen bei Matlab.
[/code]0.6*y
Code:

Bei Mathematica muss man das ja nicht, aber hier wohl.

Winkow schreibt ja.
Zitat "außerdem glaube ich nicht das "Zu wenige Input Argumente" die vollständige fehlermeldung ist."
Das kommt, weil das Skript mit der newton() Funktion erst in der untersten Zeile ausgeführt wird. Der PC bricht ja bei der ersten Zeile ab. Bei
[code]fun=@ (x) [x^2+y^2+0.6y-0.16];[x^2-y^2+x-1.6y-0.14];%Funktionen gemäss Aufgabe [/code]
ist ja schon der erste Fehler.
Wo auch noch ein Fehler in der Zeile ist, dass "fun" von x und y abhängt, aber nur x deklariert wird.

In der newton() Funktion sind nämlich auch Fehler. Da hat das mit x,xo,y oder Rechenoperationen wie ob man einen Vektor^-1 rechnen kann usw. Und die Zeile
Code:
. Da soll es doch bestimmt so heißen wie die Variable, die die Funktion newton() ausgeben soll.

Einerseits kommentierst du gut und schreibst relativ "komplizierte" Sachen wie Funktionen vom Ansatz gut usw aber andererseits machst du dann so billige Fehler bei Rechenoperationen und Bezeichnungen usw Smile Wink Das wundert mich nur etwas.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 19:44     Titel:
  Antworten mit Zitat      
Ups sorry sehe gerade Das mein Satz
"der Fehler kommt, weil du schreibst
Code: fun=@ (x) [x^2+y^2+0.6*y-0.16];[x^2-y^2+x-1.6*y-0.14]; %Funktionen gemäss Aufgabe "

falsch ist. Der Fehler kommt wegen Fehlern in der Newton Funktion.
 
Martin91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 19:58     Titel:
  Antworten mit Zitat      
Moin,

Code:
fun=@ (x) [x^2+y^2+0.6*y-0.16];[x^2-y^2+x-1.6*y-0.14]; %Funktionen gemäss Aufgabe



Den 2. Term soll doch an 2. Stelle des Vektors fun sein, so wie du das schreibst machst du dafür einen neuen "Vektor". (Und vor dem 2. ungewollten Vektor ist kein @(x,y) davor, deshalb spuckt er die Fehlermeldung "kenne Variable x im 2. Vektor nicht" aus.)
Desweiteren muss man ein Malzeichen zwischen Variable und Faktor setzen bei Matlab.
Code:

Bei Mathematica muss man das ja nicht, aber hier wohl.
Wo auch noch ein Fehler ist in der Zeile ist, dass "fun" von x und y abhängt, hier aber nur x deklariert wird.


In der newton() Funktion sind auch Fehler. Da hat das mit x,xo,y oder Rechenoperationen wie ob man einen Vektor^-1 rechnen kann usw.
Code:
Und die Zeile Code:  fx=fun(x)

Da soll fx doch bestimmt so heißen wie die Variable, die die Funktion newton() ausgeben soll.

Wäre schön wenn ein Moderator meine ersten beiden Beiträge löschen könnte, weil ich die als Gast nicht ändern oder löschen kann hab ich das jetzt noch mal richtig geschrieben. Ansonsten die beiden Posts einfach nicht beachten. Danke.
 
Martin91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 20:20     Titel:
  Antworten mit Zitat      
Was Winkow schreibt ist, dass anonyme Funktionen
Code:
fun=@ (x,y) [x^2+y^2+0.6y-0.16;x^2-y^2+x-1.6y-0.14];
dfun=@ (x,y) [2x+2y+0.6;2x-2y+1-1.6

Nicht in der Funktion newton() bekannt sind. Newton() sind nur Variablen/Funktionen bekannt die ihr übergeben werden (hier=x0,y0,TOL,NMax) oder die in der Funktion selbst (als im m-File der Funktion) definiert werden. Aber wenn du eine die Funktion so ins Command Window schreibst ist sie newton() nicht bekannt, da sie nicht übergeben wird.
 
Zuckerstange
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 22:50     Titel:
  Antworten mit Zitat      
Hi,
ich habe meinen Code jetzt nochmal etwas überarbeitet.
Mit der while Schleife habe ich leider Probleme. Habe sie selbst nur aus einer Vorlage und versuche sie jetzt an meine Aufgabe anzupassen. Ich bin mir nicht sicher ob man ytemp analog zu xtemp definieren kann. Die Variablen, die mir die Funktion ausgeben soll, sind ja die Nullstellen. Funktioniert das mit fx=fun(x,y) nicht?

Code:

function [ x ] = newton( x0,y0,TOL,NMax )
%UNTITLED Berechnung der Nullstellen


    %Zu übergebende Parameter:
    %fun: Funktion
    %dfun: Ableitung der Funktion
    %x0: Startwert x
    %y0: Startwert y
    %TOL: Toleranz
    %NMax: maximale Anzahl Iterationsschritte
   
    %Rückgabe:
    %x: approximierte Nullstelle
    %fx: Funktionswert an Stelle x
    %k: Anzahl benötigter Iterationen
 
   x=x0;
   y=y0;
   k=0;
   a=1+TOL;
    while a>TOL && k<NMax
        xtemp=-((dfun(x,y))^-1)*fun(x,y)+x;
        ytemp=-((dfun(x,y))^-1)*fun(x,y)+y;
        a=norm(xtemp-x);
        a=norm(ytemp-y);
        x=xtemp;
        y=ytemp;
        k=k+1;
    end
    fx=fun(x,y);
end
 




Ich habe fun und dfun entsprechend abgeändert. Allerdings bekomme ich für dfun folgende Fehlermeldung:

Undefined function 'dfun' for input arguments of type 'double'.

Was habe ich da übersehen?


Code:

fun=@ (x,y) [x^2+y^2+0.6+y-0.16];  @(x,y)[x^2-y^2+x-1.6*y-0.14];%Funktionen gemäss Aufgabe
dfun=@ (x,y) [2*x+2*y+0.6];  @(x,y)[2*x-2*y+1-1.6];%Abgeleitete Funktionen
x0=0.6 ;%Startvektor x der Iteration [ ]
y0=0.25;%Startvektor y der Iteration [ ]  
TOL=10^-6;%gewünschte Toleranz
NMax=20;%maximale Anzahl der Iterationen
[ x ] = newton( x0,y0,TOL,NMax )%Vorgegebene Matlab-Funktion Newton Iteration
 



Danke schon mal für die Geduld mit mir Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 23:17     Titel:
  Antworten mit Zitat      
Tja, das ist genau das Problem, was Winkow und ich im letzten Beitrag um 19:20Uhr geschrieben haben...


Weiter:
Code:
fun=@ (x,y) [x^2+y^2+0.6+y-0.16];  @(x,y)[x^2-y^2+x-1.6*y-0.14];%Funktionen gemäss Aufgabe
dfun=@ (x,y) [2*x+2*y+0.6];  @(x,y)[2*x-2*y+1-1.6];%Abgeleitete Funktionen


So ist das noch nicht richtig. fun soll doch ein Vektor mit 2 Einträgen sein der Form fun=@(x,y)[a;b] oder?
Wenn das so sein muss, müsstest du was bei den Rechenoperationen ändern.

Außerdem schreibst du a=....; und in der nächsten Zeile wieder a="was anderes"; das macht auch keinen Sinn.


Die letzte Zeile
Code:
fx=fun(x,y);
ist auch immer noch falsch.
 
Zuckerstange
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2015, 23:54     Titel:
  Antworten mit Zitat      
Hi Martin91,

danke für deine Antwort.
In der Form fun=@(x,y)[a;b] muss es so jetzt richtig sein oder?
Trotzdem bekomme ich gleiche Fehlermeldung Crying or Very sad

Code:

fun=@(x,y)[x^2+y^2+0.6+y-0.16 ; x^2-y^2+x-1.6*y-0.14];%Funktionen gemäss Aufgabe
dfun=@(x,y)[2*x+2*y+0.6 ; 2*x-2*y+1-1.6];%Abgeleitete Funktionen
 



Ich habe anstatt dem fx=fun(x,y) etwas anderes versucht.
Aber an der Zeile "x=x0; " hat er iwas zu meckern. Fehlt da noch was?

Code:

function [ x ] = newton( x0,y0,TOL,NMax )
%UNTITLED Berechnung der Nullstellen

    %Zu übergebende Parameter:
    %fun: Funktion
    %dfun: Ableitung der Funktion
    %x0: Startwert x
    %y0: Startwert y
    %TOL: Toleranz
    %NMax: maximale Anzahl Iterationsschritte
   
    %Rückgabe:
    %x: approximierte Nullstelle
    %fx: Funktionswert an Stelle x
    %k: Anzahl benötigter Iterationen
 
   x=x0;
   y=y0;
   k=0;
   a=1+TOL;
    while a>TOL && k<NMax
        xtemp=-((dfun(x,y))^-1)*fun(x,y)+x;
        ytemp=-((dfun(x,y))^-1)*fun(x,y)+y;
        a=norm(xtemp-x);
        x=xtemp;
        y=ytemp;
        k=k+1;
    end
    disp('Nullstelle der Funktion nach Annäherung bei')
    disp(x) % Ergebnis
    disp('Nach Anzahl der Durchläufe : ')
    disp(k) % Durchlauf
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2015, 00:18     Titel:
  Antworten mit Zitat      
Ja es kommt die gleiche Fehlermeldung, weil die anonymen Funktionen fun/dfun nicht innerhalb der newton() funktion bekannt sind. Sie müssen, weil sie anonyme Funktionen sind, erst übergeben weden.

Also
Code:
function [ x ] = newton( x0,y0,TOL,NMax,fun,dfun)



Die Form ist jetzt richtig bei fun, aber es muss
Code:
in fun heißen oder?

Jetzt soll der PC in der Rechnung
Code:
xtemp=-((dfun(x,y))^-1)*fun(x,y)+x;
        ytemp=-((dfun(x,y))^-1)*fun(x,y)+y;


einen Vektor^-1 und mit einen anderen Vektor multiplizieren rechnen. Da musst du herrausfinden, wie man das alles punktweise/elementweise berechnen kann. Also jedes Element des Vektors^-1 rechnen und dann mit dem entsprechenden Element des andern Vektors multplizieren. Dann ist das ytemp jeweils der 2. Eintrag im Vektor und xtemp der erste Eintrag.
 
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.