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

Differentialgleichung mit mehreren Variablen

 

flamebird
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2012, 08:54     Titel: Differentialgleichung mit mehreren Variablen
  Antworten mit Zitat      
Hallo liebe Leute,

könntet ihr mir vielleicht weiterhelfen? Ich habe eine Differentialgleichung erster Ordnung, wobei die Funktion aber von zwei Variablen abhängig ist. Sie sieht wie folgt aus:


<br />
\frac{df(k,t)}{dt}=\frac{0,4 g(k)^{2}}{1-exp(-0,2(1-t))}(f(k-1,t)-f(k,t))
<br />

mit E(x,0)=0 und E(0,t)=0 und g(k) ist eine Funktion, die ich schon ausgelagert habe und mir Werte aus den reellen Zahlen zurückgibt.

Kann Matlab sowas auch berechnen? Wenn ja, könnte mir dann vielleicht jemand bei der Implementierung helfen? Im Internet habe ich diesbezüglich nämlich nichts spezielles gefunden. Ich finde immer nur Beispiele für Differentialgleichungen, die nur von einer Variablen abhängen.
Der Graph, der als Lösung rauskommt wird ja bestimmt 3-dimensional sein? Kann ich dann auch einfach ein festes k nehmen und mir das in Abhängigkeit von nur t zeichnen lassen?


Vielen Dank schonmal im Voraus, falls mir jemand helfen kann.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2012, 20:54     Titel:
  Antworten mit Zitat      
Hallo,

sieht mir nach einer Ortsdiskretisierung aus. Ob das ganze so sinnvoll ist, ist die andere Frage.

Fragen wären u.a.: sind f und E gleichwertig? Ist k beschränkt?

Grundsätzlich sollte dein Vorhaben kein Problem sein; du musst nur einen Vektor der d f(i, t) / dt an ode45 übergeben.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2012, 12:23     Titel:
  Antworten mit Zitat      
Da habe ich mich ja total vertippt. Natürlich sind E und f das gleiche. k ist leider nicht beschränkt. Hat das irgendwelche Auswirkungen, auf das Verhalten von Matlab beim Lösen?

Also muss ich das System für jedes einzelne k lösen lassen. Wie kann ich denn dann das f(k-1,t) mit übergeben?

Vielen Dank für deine Antwort Harald.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.08.2012, 14:01     Titel:
  Antworten mit Zitat      
Hallo,

k muss beschränkt sein, sonst macht eine numerische Lösung keinen Sinn.

Wenn k beschränkt ist, kannst du genauso vorgehen wie in dem Beispiel in
Code:

Nur hast du eben nicht y_1, y_2, ..., sondern f(1,t), f(2,t), ...

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2012, 13:27     Titel:
  Antworten mit Zitat      
Danke erst einmal Harald. Du hast mir schon sehr geholfen. Ich habe es jetzt so gemacht, nur leider stimmt die Lösung, die damit ausgegeben wird nicht richtig. Zum Beispiel habe ich mir f(1,t) plotten lassen und habe es mit der Lösung verglichen, wenn ich mir die DGL für k=1 mit der symbolic math toolbox berechnen lassen möchte. Ab t=0.9 wird mit ode45 nicht mehr richtig gerechnet und der Graph hört dort einfach auf. Gerade diese Stelle ist aber interessant. Und wenn ich mir f(5,t) plotten lasse, fällt der Graph viel langsamer als er eigentlich soll.

Hier erstmal mein Code für das System der DGL (ich habe die Werte für g(k) jeweils schon eingesetzt):
Code:
function dy=fprime(t,y)

dy=zeros(6,1);
dy(1)=-(0.2*1.5811)^2/(1-exp(-0.2*(1-t)))*y(1);
dy(2)=(0.2*(-0.9772))^2/(1-exp(-0.2*(1-t)))*(y(1)-y(2));
dy(3)=(0.2*1.1663)^2/(1-exp(-0.2*(1-t)))*(y(2)-y(3));
dy(4)=(0.2*(-1.1021))^2/(1-exp(-0.2*(1-t)))*(y(3)-y(4));
dy(5)=(0.2*1.1233)^2/(1-exp(-0.2*(1-t)))*(y(4)-y(5));
dy(6)=(0.2*(-1.1163))^2/(1-exp(-0.2*(1-t)))*(y(5)-y(6));
end


Und der Aufruf erfolgt ja dann mit:
Code:
[T,Y]=ode45(@fprime,[0 1],[1 2 3 4 5 6])

Hatte mit im Anfangspost auch verschrieben, die Anfangswerte sind f(k,0)=k.
Die Lösung für f(1,t) ist aber
Code:
function y=f1(t)
y =(exp(-(249987721*t)/2500000000)*(exp(-1/5)*exp(t/5) - 1)^(249987721/500000000))/(exp(-1/5) - 1)^(249987721/500000000);
end


Anbei habe ich noch die jeweiligen Plots angefügt.
Für das letzte Stück zwischen 0.9 und 1 wird mir immer NaN angezeigt bzw. Infinity. Aber es gibt ja eine Lösung.

f(1,t) mit ode45.jpg
 Beschreibung:
Das ist die Lösung, wenn numerisch mit ode-solver gearbeitet wurde.

Download
 Dateiname:  f(1,t) mit ode45.jpg
 Dateigröße:  14.75 KB
 Heruntergeladen:  921 mal
f(1,t).jpg
 Beschreibung:
Lösung mit Symbolic Math Toolbox

Download
 Dateiname:  f(1,t).jpg
 Dateigröße:  15.82 KB
 Heruntergeladen:  911 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2012, 08:16     Titel:
  Antworten mit Zitat      
bei t = 1 wird der Term unter dem Bruchstrich Null. Das bringt ein Probleme mit sich. Wenn man die Fehlertoleranzen des solvers ändert wird es schon besser.

Code:

options = odeset('RelTol',1e-9);
dy = @(t,y) -(0.2*1.5811)^2./(1-exp(-0.2*(1-t)))*y;

[t1,y1] = ode45(dy,[0,1],1);
[t2,y2] = ode45(dy,[0,1],1,options);

plot(t1,y1,t2,y2)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
flamebird
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.08.2012, 13:12     Titel:
  Antworten mit Zitat      
Danke Thomas, somit wird wenigstens schonmal richtig gezeichnet.

Mich wundert es nur immer noch, dass die nachfolgenden f(k,t) k=2,... so flach am Anfang fallen. Die müssten viel schneller gegen 0 gehen und nicht erst am Ende. Wird der y-Wert eigentlich auch immer gleich aktualisiert? Also der richtige y(1) -Wert genommen, wenn ich dy(2) berechne oder muss man das nochmals gesondert betrachten? Die DGls sind auf jeden fall richtig ausfgestellt.

Sonst hätte ich noch die Idee, dass ich zuerst dy(1) löse. dy(2) dann gesondert löse, also dort dann nochmal den ode-solver für jeden einzelne t reinsetze. Das ist vielleicht nicht so toll gelöst, müsste doch aber eigentlich auch klappen?

f(k,t).jpg
 Beschreibung:
f(k,t) für k=1,...,6

Download
 Dateiname:  f(k,t).jpg
 Dateigröße:  22.35 KB
 Heruntergeladen:  889 mal
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 - 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.