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

ODE45 Numerische Lösung eine diff. Gleichung

 

Chebbi
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 13.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2019, 15:18     Titel: ODE45 Numerische Lösung eine diff. Gleichung
  Antworten mit Zitat      
Guten Tag,


ich habe eine DGL die ich numerisch lösen möchte, ich versuche seit paar Tagen komme ich aber nicht voran. Hoffentlich könnt ihr mir weiter helfen.

Die Gleichung ist:
(dy(t))/dt=1/(A p(t)) [B m(t)-y(t)(B m(t)+m_dot ̇(t)  C)]

wobei A, B, C, D sind Konstanten und p(t), m(t) und m_dot(t) sind Variablen die iteratif mit y(t) gerechnet werden in den nächsten Schritten.

Anfangswerte für y(t), m(t), m_dot(t) und p(t) habe ich.

mein Ansatz war:

Code:
function dxdt = DGL(t,x)

A = 1;
B = 2;
C=3;
D=4;


dxdt = zeros(2,1);
dxdt(1) = (1/(A*x(2)))*(B*x(3)-x(1)*(D*x(3)+C*x(4)));
dxdt(2) = x(4);



t0=0;
tf=5;
tspan = [t0 tf];


y0 = [0 0.01 0 0];


ode45(@DGL,tspan,y0);


Danke für jede Hilfe!
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: 10.01.2019, 08:52     Titel:
  Antworten mit Zitat      
Hallo,

wo ist nun die konkrete Frage?

Ich blicke hier noch nicht so recht durch. Du gibst eine DGL an, verwendest aber x(1) bis x(4), was auf 4 DGLen hindeutet und dxdt(1) und dxdt(2), was auf 2 DGL hinweist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Chebbi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 13.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2019, 09:37     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke für deine Antwort, mein Ansatz ist möglicherweise fehlerhaft. Es wäre sehr nett basierend auf meine DGL einen anderen Ansatz mir vorzuschlagen.

ich hab das so verstanden das falls ich in der Gleichung 3 Variablen die Zeitlich sich ändern habe, muss ich die mit x(1), x(2)... benennen.
die dxdt(2) sollte für die zweite ableitung die in der Gleichung ist (m_dot).

Es sieht so aus das ich auf die falsche Spur bin. Muss ich vier Funktioen/Gleichungen schreiben?
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: 10.01.2019, 11:42     Titel:
  Antworten mit Zitat      
Hallo,

um dir helfen zu können, müsste ich das besser verstehen:
Zitat:
p(t), m(t) und m_dot(t) sind Variablen die iteratif mit y(t) gerechnet werden in den nächsten Schritten.

Du brauchst für jeden Zeitpunkt p, m und m_dot, um y' berechnen zu können.

Mich wundert auch das m und m_dot. Sollte es dafür dann für m nicht auch eine DGL geben?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Chebbi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 13.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2019, 12:06     Titel:
  Antworten mit Zitat      
Hallo Harald,


Danke für die Hilfe!!

"Du brauchst für jeden Zeitpunkt p, m und m_dot, um y' berechnen zu können. "
das Stimmt, im ersten zeitpunkt brauche ich die Anfangswete von allen Variablen, dannach mit Y(t) rechne ich die nächste Variable (Beispiel P(T)), dannach m_dot(t) dann m(t). nachdem ich werte für alle Variablen habe rechne ich Y(t+delta t)
Habe ich ein Denkfehler?

die Funktion um m zu berechnen ist von m_dot abhängig: m(t2)=m(t1)+(m_dot(t1)*Delta t)
ansonsten wäre die 2te Gleichung die ich aufgeschrieben habe: dm(t)/dt=m_dot(t) unter
Code:
dxdt(2) = x(4);



Grüße,
Chebbi
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: 10.01.2019, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

wenn P(t), m_dot(t) und m(t) in Abhängigkeit von y(t) berechnet werden können, dann musst du genau das in der Funktion machen, die an ode45 übergeben wird.
Wenn m_dot vorgegeben ist, kannst du m "mit-integrieren" lassen.

Generell musst du dich entscheiden, ob du das Integrieren der DGL ode45 überlassen willst oder das mit dem Euler-Verfahren selber machst. Beides zu vermischen bringt nichts.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Chebbi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 13.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2019, 10:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Hilfe, ich habe die Gleichungen vereinfacht und wie folgt geschrieben:

Code:
function dYm = diffYm(t, Ym)

clc;

%split Ym into variables in the equations

m = Ym(1);
Y = Ym(2);

%define the derivatives of these variables from equations

dmdt = 1+(2*Y*m-3);
dYdt = (1/m)*(3-Y(6*Y*m-7));

%the derivatives in dYm in the right order

dYm = [dmdt;dYdt];

%solution

[t, Ym]= ode45('diffYm',0,10,[1 0]);

end



dann bekomme ich diese Fehlermeldung:

"Not enough input arguments."

Was mache ich nun falsch? und wie kann ich das beheben.
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: 11.01.2019, 12:14     Titel:
  Antworten mit Zitat      
Hallo,

der Aufruf von ode45 muss außerhalb der Funktion sein (z.B. im Command Window) und sollte so aussehen:
Code:
[t, Ym]= ode45(@diffYm,[0,10],[1 0]);

evtl. muss das letzte Argument ein Spaltenvektor sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Chebbi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 13.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2019, 12:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für den Hinweis, leider trotz der Änderung habe ich immer noch die gleiche Fehlermeldung.

Code:
function dYm = diffYm(t, Ym)

clc;

%split Ym into variables in the equations

m = Ym(1);
Y = Ym(2);

%define the derivatives of these variables from equations

dmdt = 1+(2*Y*m-3);
dYdt = (1/m)*(3-Y(6*Y*m-7));

%the derivatives in dYm in the right order

dYm = [dmdt;dYdt];

 end


Fehlermeldung:

"Not enough input arguments.

Error in diffYm (line 7)
m = Ym(1);"


Ich habe zwei Variablen und zwei Gleichungen, warum beschwert er sich?
habe ich hier am Anfang falschgeschrieben: "diffYm(t, Ym)"


Grüße,
Chebbi
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: 11.01.2019, 14:04     Titel:
  Antworten mit Zitat      
Hallo,

ich kann die Fehlermeldung nicht nachvollziehen.
Du musst wie gesagt den ode45-Aufruf getrennt halten. Ausgeführt werden muss der ode45-Aufruf, nicht die DGL-Funktion.

Fehlt in der Zeile dYdt = (1/m)*(3-Y(6*Y*m-7)); noch ein * nach 3-Y?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Chebbi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 13.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2019, 15:06     Titel:
  Antworten mit Zitat      
Hallo Harald,


vielen Dank für deine Unterstützung!

Harald hat Folgendes geschrieben:
Ausgeführt werden muss der ode45-Aufruf, nicht die DGL-Funktion.

Es lag tatsächlich daran. Mann muss die Funktion nicht ausführen, warum ein verwirrender Fehler bei der Ausführung trotzdem entsteht verstehe ich nicht, ist aber nicht wichtig. (Ausgeführt habe ich die Funktion um sicher zu sein das erstmal kein Fehler da war)

Harald hat Folgendes geschrieben:

Fehlt in der Zeile dYdt = (1/m)*(3-Y(6*Y*m-7)); noch ein * nach 3-Y?

Danke für den Hinweis, stimmt ein Zeichen hat in diesem Beispiel gefehlt.


Sehr hilfreich waren deine Antworte, vielen Dank nochmal!
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: 12.01.2019, 17:30     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
warum ein verwirrender Fehler bei der Ausführung trotzdem entsteht verstehe ich nicht, ist aber nicht wichtig

So verwirrend ist das eigentlich gar nicht: eine Funktion benötigt Eingabeargumente. Wenn du das über ode45 aufrufst, übernimmt es ode45, die Funktion mit Argumenten zu füttern. Wenn du die Funktion testen willst, ginge das z.B. so:
Code:
dYm0 = diffYm(0, [1,0])


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.