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

DGL mit zeitabhängigem Vektor

 

Lakitu
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.10.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2017, 13:38     Titel: DGL mit zeitabhängigem Vektor
  Antworten mit Zitat      
Hallo,

ich möchte diese Differentialgleichung lösen

dV/dt=K1*exp(-K2/(K3*T))*(K4-V)

K1,K2, K3 und K4 sind hierbei Konstanten. Die Temperatur T verändert sich allerdings mit jedem Zeitschritt. Also habe ich mit timespan und T zwei Vektoren derselben Länge. Jeder Zeitpunkt wird dabei einer Temperatur zugewiesen.

Meine Frage:
Wie kann ich den Vektor T in die DGL einbauen? In meinem Beispiel habe ich es mit dem ODE-Solver probiert. Hierbei bekomme ich den Fehler, dass die Vektorlängen der Funktion und des Anfangswertes nicht übereinstimmen.
Wenn ich für T einen einzelnen Wert einsetze, funktioniert es, aber natürlich nicht mit dem gewünschten Ergebnis. Kann man vielleicht eine Schleife nutzen?
Bin ich denn mit ODE-solver auf dem richtigen Pfad oder gibt es da eine andere Lösung?

Die beiden Vektoren haben in Wirklichkeit knapp 150 Elemente...ich habe sie aufgrund der Übersichtlichkeit auf 10 gekürzt.

Code:
function Versuch ()

% Konstanten
K1=30000;
K2=43000;
K3=8.314;
K4=0.6;

%Messzeitpunkte
timespan=[0 0.005 0.01 0.015 0.02 0.025 0.035 0.04 0.045 0.05]';

% Temperaturen abhängig zu den Messzeitpunkten
T=[500 600 700 800 1000 1130 1230 1310 1370 1400]';

% Anfangswert
V0=0;

[t,V]=ode45(@rechteSeite,timespan,V0);
plot(t,V)


    function dVdt = rechteSeite(t,V)
       
       
        dVdt=[K1*exp(-K2/(K3*T))*(K4-V)]';
       
    end
       
       
end


Würde mich sehr freuen, wenn sich jemand findet, der eine Lösung für das Problem hat.

Viele Grüße, Tobi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

du musst das passende T heraussuchen, z.B. über Interpolation.

Code:
T_momentan = interp1(timespan, T, t, 'linear');
 dVdt=[K1*exp(-K2/(K3*T_momentan))*(K4-V)]';


Dabei musst du aus der Anwendung heraus entscheiden, was eine sinnvolle Interpolationsmethode ist.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.10.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2017, 15:41     Titel:
  Antworten mit Zitat      
Hallo Harald,

damit funktioniert es ganz gut.

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

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.10.2017, 15:50     Titel:
  Antworten mit Zitat      
Hallo,

"ganz gut" klingt nicht optimal. Was könnte denn besser sein?
Und wie gesagt, auf die richtige Interpolationsmethode achten...

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.10.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2017, 17:27     Titel:
  Antworten mit Zitat      
Doch das läuft spitze. Habe mich da nicht deutlich ausgedrückt;)
Da ich ja genug Messdaten habe, ist eine lineare Interpolation völlig ausreichend!
Bin sehr erleichtert endlich eine Lösung gefunden zu haben.

Versuche allerdings gerade das System etwas zu erweitern und stehe schon wieder ein wenig auf dem Schlauch. Ich möchte, dass V=0 gilt, wenn T<650. Mit anderen Worten, soll die Startbedingung V0=0 erst dann gelten, wenn eine Temperatur 650 und die dazugehörige Zeit erreicht ist.

Habe es mal mit einer Schleife und einer if Bedingung versucht, was aber nicht den Anfangswert verschiebt, sondern nur einen Sprung der Funktion bei T=650 verursacht.

Code:
function Versuch ()

% Konstanten
K1=30000;
K2=43000;
K3=8.314;
K4=0.6;

%Messzeitpunkte
timespan=[0 0.005 0.01 0.015 0.02 0.025 0.035 0.04 0.045 0.05]';

% Temperaturen abhängig zu den Messzeitpunkten
T=[500 600 700 800 1000 1130 1230 1310 1370 1400]';

% Anfangswert
V0=0;

[t,V]=ode45(@rechteSeite,timespan,V0);
plot(t,V)


    function dVdt = rechteSeite(t,V)
       
        T_momentan = interp1(timespan, T, t, 'linear');
        dVdt=[K1*exp(-K2/(K3*T_momentan))*(K4-V)]';

       
       end
     index=1;
       
                 for s=1:length(T)
   
                     if(T(index)<=650)
       
                     V(index)=0;
       
                     end
   
                 index=index+1;
                 end            
plot(t,V)
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.10.2017, 08:33     Titel:
  Antworten mit Zitat      
Hallo,

wäre es dann nicht sinnvoller, den T-Vektor vor dem Lösung der DGL entsprechend zu kürzen und timespan anzupassen?
Enthält dein tatsächlicher T-Vektor einen Wert, der genau 650 ist?

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 24.10.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 11:15     Titel:
  Antworten mit Zitat      
Ja, so habe ich das jetzt auch gemacht. Jetzt habe ich das Ergebnis, was ich haben wollte. Bei meinen Messdaten habe ich keinen genauen Wert für 650. Aber ich habe für alle 3-4 Kelvin einen neuen Wert. Und 650°C ist nur eine grobe Richtung für den Start der Reaktion. Deswegen passt das so.
Vielen Dank nochmal für die Tipps. Das hat mir sehr weitergeholfen.

Code:
function Versuch ()

% Konstanten
K1=30000;
K2=43000;
K3=8.314;
K4=0.6;

%Messzeitpunkte
timespan=[0 0.005 0.01 0.015 0.02 0.025 0.035 0.04 0.045 0.05]';

% Temperaturen abhängig zu den Messzeitpunkten
T=[500 600 700 800 1000 1130 1230 1310 1370 1400]';

T_neu=T(T>=650);
timespan_neu=timespan(((end+1)-size(T_neu)):end);

% Anfangswert
V0=0;

[t,V]=ode45(@rechteSeite,timespan_neu,V0);
plot(t,V)


    function dVdt = rechteSeite(t,V)
       
        T_momentan = interp1(timespan_neu, T_neu, t, 'linear');
        dVdt=[K1*exp(-K2/(K3*T_momentan))*(K4-V)]';

       
    end
           
plot(t,V)
end
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.