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

Bräuchten Hilfe beim Programmieren von impliziten Funktione

 

Erdnuckel
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 12:23     Titel: Bräuchten Hilfe beim Programmieren von impliziten Funktione
  Antworten mit Zitat      
Hey Leute!

Wir haben in der Uni die Aufgabe ein mathematisches Problem in Matlab zu programmieren. Es handelt sich dabei um eine Aufgabe zum Thema „Implizite Funktionen“.

Unser Prof gab uns aber weder eine Vorlesung zum Thema implizite Funktionen noch zu Matlab. Im Endeffekt stehen wir ziemlich bei Null. Das einzige was wir mittlerweile mit unserem Prof zusammen erarbeitet haben, ist folgendes Programm, in dem die Kreisgleichung mit Hilfe von Matlab beschrieben werden soll. Leider verstehen wir aber noch nicht ganz was er mit diesem Programm machen will. Hat Jemand eine Ahnung was dieses Programm Schritt für Schritt macht und was man im Endeffekt am Schluss ausgeben will?

Außerdem hat unser Prof gemeint, dass in diesem Programm noch ein Fehler ist und die Werte noch nicht genau genug ausgegeben werden. Wie könnte man das lösen, dass die Werte genauer werden? Wir sind ziemlich verzweifelt, da wir deswegen mittlerweile ziemlich im Stress sind und bald Abgabe ist.

Wäre echt cool wenn uns jemand helfen könnte.

Vielen Dank schon mal im Vorraus!

Tom


Code:
% Implizite Funktionen 1D
% am Beispiel x2 + y2 - 1 = 0
 
% Aufl?sungspunkt
x0 = 0;
y0 = 1;
 
% Intervall
a   = 1.0;
dx  = 0.01;
x   = [-a:dx:a];
 
% y - Werte vorbesetzen
genau  = 10^(-3);
fehler = 1.0;
 
% Iteration
for k=1:length(x);
    y_start = y0;
    y(k)    = y_start;
    while (fehler > genau)
       y_neu  = y(k) - (1/(2*y0))*(y(k)^2 + x(k)^2 - 1);
       fehler = abs(y_neu-y(k));
       y(k) = y_neu;
    end;
    fehler =1.0;
end;
 
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2010, 14:20     Titel:
  Antworten mit Zitat      
Hallo,

das Programm berechnet für verschiedene x die y, welche die Gleichung:

x^2 + y^2 - 1 = 0

erfüllen. Dazu wird das Newton Verfahren angewandt.

Der Fehler liegt in dieser Zeile:

Code:

y_neu  = y(k) - (1/(2*y0))*(y(k)^2 + x(k)^2 - 1);
 


findet ihr bestimmt, wenn ihr euch das Verfahren mal genauer anseht.
Die Genauigkeit kann verbessert werden indem ihr genau auf einen kleineren Wert setzt.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2010, 14:20     Titel:
  Antworten mit Zitat      
Hallo,

Erstmal vielen Dank für deine schnelle Antwort!
Wir verstehen jetzt schon ein bisschen mehr...

Folgendes ist uns jedoch noch unklar:

Wir haben nun "genau" auf verschiedene deutlich kleinere Werte gesetzt, jedoch ändert sich beim geplotteten Graphen rein gar nichts. Woran liegt das bzw. was sollte sich denn eigentlich ändern?
Der Graph sieht wie die obere Hälfte eines ovalen Eies aus. Ist diese Tatsache der Fehler in unserem Programm?

Außerdem haben wir uns auch das Newton Verfahren nochmal genauer angesehen, kommen aber nicht auf den Fehler in der von dir zitierten Zeile. Das Newton Verfahren besagt doch folgendes:
y,n+1 = y,n - f(y(n))/f'(y(n))
und genau das haben wir doch in dieser Zeile oder?

Wir wären dir sehr dankbar, wenn du uns nochmal weiter helfen könntest!
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2010, 14:48     Titel:
  Antworten mit Zitat      
Zitat:

Wir haben nun "genau" auf verschiedene deutlich kleinere Werte gesetzt, jedoch ändert sich beim geplotteten Graphen rein gar nichts. Woran liegt das bzw. was sollte sich denn eigentlich ändern?


Ich glaub man muss schon etwas zoomen um die Unterschiede zu erkennen. Ihr könnt ja mal mit der analytischen Lösung vergleichen (y = sqrt(1-x^2) ).

Zitat:

y,n+1 = y,n - f(y(n))/f'(y(n))
und genau das haben wir doch in dieser Zeile oder?


Fast. Wie lautet denn f'(y(n))?
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2010, 09:50     Titel:
  Antworten mit Zitat      
f'(y(n)) = 2y und da y = 1 ist, bleibt doch nur noch die 2 stehen, durch die ich die f(y(n)) teile oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2010, 14:07     Titel:
  Antworten mit Zitat      
y ist doch nicht 1 sondern die gesuchte Lösung der Gleichung:

f(y) = 0 mit f(psi) := x^2 + psi^2 -1

Mit Hilfe des Newton-Verfahrens kann man eine Folge definieren, die gegen die gesucht Lösung konvergiert.

y,n+1 = y,n - f(y,n)/f'(y,n)

Wie lautet jetzt f(y,n) und wie f'(y,n) ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2010, 15:15     Titel:
  Antworten mit Zitat      
ganz doofe frage, aber was bedeutet denn das "psi"?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.06.2010, 07:02     Titel:
  Antworten mit Zitat      
psi ist das argument der funktion: Exakt muss es heißen:

f: R -> R , f(psi) := x^2 + psi^2 - 1

Ich hab nur psi verwendet, damit man es nicht mit der gesuchten Lösung verwechselt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2010, 14:28     Titel:
  Antworten mit Zitat      
Okay, dann ist f'(y,n) in diesem Fall quasi f'(psi,n) wenn ich das richtig verstanden habe oder? Und das wäre dann ja wie ich oben schon geschrieben habe 2y bzw. 2psi oder?

Und mit f(psi) := x^2 + psi^2 - 1 hätte ich dann folgendes Newtonverfahren:

y,psi+1 = y,psi - (x^2 + psi^2 - 1)/(2psi)
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2010, 15:24     Titel:
  Antworten mit Zitat      
Ist ja alles richtig gerechnet, aber du wirfst immer die Notation durcheinander. Daher weiss ich nicht ob du's nicht richtig verstanden hast oder ob das nur Schreibfehler sind.
Also noch mal zusammengefasst:

Du willst folgendes Gleichungssystem lösen:
x^2 + y^2 -1 = 0

Die Lösung ist die Nullstelle der funktion f: R-> R, f(psi) = x^2 + psi^2 - 1.
Jetzt wendest du das Newton Verfahren an um diese Nullstelle zu bestimmen.
Das Newton Verfahren besagt: die Folge

y_{n+1} = y_{n} - f(y_{n})/f'(y-{n})

konvergiert gegen die Nullstelle.
Das heisst du denkst dir ein y_0 aus und berechnest ein y_1, und damit ein y_2 usw.
Jetzt setzen wir mal richtig ein:
f(y_{n}) = x^2 + y_{n}^2 - 1
f'(y_{n}) = 2*y_{n}

Damit folgt:
y_{n+1} = y_{n} - (x^2 + y_{n}^2 - 1)/(2*y_{n})
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2010, 18:42     Titel:
  Antworten mit Zitat      
Okay, damit folgt für den Code in besagter Zeile, dass bei dem x(k) das (k) weg muss?

Code:
y_neu  = y(k) - (1/(2*y0))*(y(k)^2 + x^2 - 1)


Und bei dem y0 bin ich mir auch nicht sicher ob das so richtig ist, oder ob es y(k) heißen muss:


Code:
y_neu  = y(k) - (1/(2*y(k)))*(y(k)^2 + x^2 - 1)


Ich hoffe ich lieg nicht komplett daneben...
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2010, 06:37     Titel:
  Antworten mit Zitat      
Zitat:


Und bei dem y0 bin ich mir auch nicht sicher ob das so richtig ist, oder ob es y(k) heißen muss:



den Fehler meinte ich.

mit Hilfe der letzten Gleichung kannst du zu jedem x denn y-Wert iterativ berechnen (while Schleife) . Falls du das für mehrere verschiedene x-Werte machen willst, musst du diese natürlich verändern. Dafür ist die for-Schleife da.
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2010, 12:51     Titel:
  Antworten mit Zitat      
Alles klar, vielen Dank, du hast uns bisher wirklich super geholfen!!!

Nun müssen wir noch ne weitere (kompliziertere) implizite Funktion unserer Wahl programmieren. Unsere Frage: Wir können die doch mit genau dem selben Code programmieren, das einzige was wir ändern müssen is doch wieder folgende Zeile, indem wir die neue Fuktion und die neue abgeleitete Funktion einsetzen.

Code:
y_neu  = y(k) - (1/(2*y0))*(y(k)^2 + x(k)^2 - 1)


Und zusätzlich noch andere Werte für x0 und y0 vorgeben.

Sehen wir das richtig?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2010, 21:38     Titel:
  Antworten mit Zitat      
ja, stimmt so. wobei x0 in dem programm nie benutzt wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
Erdnuckel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 15.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2010, 14:41     Titel:
  Antworten mit Zitat      
Also wir wollen jetzt folgendes Gleichungssystem mit unserem Code lösen:


x(1+y²)-e^(2x-6y)+1 = 0

( Nur 2x-6y ist der Exponent)

Wir haben es mit folgendem Code versucht:

Code:

% Implizite Funktionen 1D
% am Beispiel x(1+y^2)-e^(2x-6y) +1
 
% Aufl?sungspunkt
x0 = 0;
y0 = 1;
 
% Intervall
a   = 1.0;
dx  = 0.01;
x   = [-a:dx:a];
 
% y - Werte vorbesetzen
genau  = 10^(-3);
fehler = 1.0;
 
% Iteration
for k=1:length(x);
    y_start = y0;
    y(k)    = y_start;
    while (fehler > genau)
       y_neu  = y(k) – [1/(2*y(k)*x-exp(2*x-6*y(k))*(-6)]*[x*(1+y(k)^2)-exp(2*x-6*y(k))+1];
       fehler = abs(y_neu-y(k));
       y(k) = y_neu;
    end;
    fehler =1.0;
end;
 


Leider bringt er folgende Fehlermeldung:

??? y_neu = y(k) – [1/(2*y(k)*x.-exp(2*x.-6*y(k))*(-6)]*[x.*(1+y(k)^2)-exp(2*x.-6*y(k))+1];
|
Error: The input character is not valid in MATLAB statements or expressions.


Wo liegt diesmal unser Fehler und wie müssen wir unser y0 wählen?

Über diese letzte Hilfe wären wir äußerst dankbar, da bald Abgabe ist...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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