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

Konstante in DGL zeitabhängig ändern

 

Moartl
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 11.05.08
Wohnort: ---
Version: 7.11.0 (Mac)
     Beitrag Verfasst am: 11.05.2008, 14:06     Titel: Konstante in DGL zeitabhängig ändern
  Antworten mit Zitat      
Hallo,
ich möchte in einem DGL-System eine Konstante für eine bestimmte Zeit auf einen anderen Wert setzen. Praktisch soll das so aussehen (Simulation über sagen wir 200 Minuten): Start, Konstante auf Wert a, nach 70 Minuten Konstante auf Wert b setzen, bei Minute 80 Konstante wieder auf Wert a setzen, weiter laufen lassen bis zum Schluss. Das zugrunde liegende Problem ist eine biologische Simulation während der sich die Lebensdauer eines Proteins zu einem gewissen Zeitpunkt stark verändert. Es handelt sich also nicht um eine komische Spielerei Wink .
Meine Lösung war die folgende: Ich habe zwei Funktionen mit dem DGL-System in unterschiedlichen .m-files in denen jeweils diese Lebenszeit unterschiedlich ist. Dann simuliere ich die erste Funktion mit einer Simulationszeit von 70 Minuten, nehme den Endwert der Lösung als Anfangswert der Simulation der zweiten Funktion und lasse diese für 10 Minuten laufen. Allerdings übernimmt er den Anfangswert schon nicht richtig. Damit kann ich den dritten Teil der Simulation erstmal vergessen... Sad

Hier mal der Code:
Funktion 1 - singlekin.m:
Code:

function dydt = singlekin(t,y)

dydt=zeros(size(y));

Vm1 = 3600;
n1 =2.7;
s1 =11;
Km1 = 3600;
lambda = 0.0039;
Kmi1 = 5000;

Vm2 = 12300;
n2 = 3.4;
s2 = 10;
Km2 = 60000;
Kmi2 = 20000;

TF1t = y(1);
TF2t = y(2);
TF1 = y(3);
TF2 = y(4);
R2 = y(5);
R1 = y(6);


dydt(1) = Vm1*(TF1t+TF1)^n1 / ((Km1^n1 + (TF1t+TF2)^n1) * (1 + R1/Kmi1)) + s1 - lambda;
dydt(2) = Vm2*(TF2t+TF2)^n2 / ((Km2^n2 + (TF2t+TF2)^n2) * (1 + R2/Kmi2)) + s2 - lambda;
dydt(3) = Vm1*(TF1t+TF1)^n1 / ((Km1^n1 + (TF1t+TF2)^n1) * (1 + R1/Kmi1)) + s1 - lambda;
dydt(4) = Vm2*(TF2t+TF2)^n2 / ((Km2^n2 + (TF2t+TF2)^n2) * (1 + R2/Kmi2)) + s2 - lambda;
dydt(5) = Vm1*(TF1t+TF1)^n1 / ((Km1^n1 + (TF1t+TF2)^n1) * (1 + R1/Kmi1)) + s1 - lambda;
dydt(6) = Vm2*(TF2t+TF2)^n2 / ((Km2^n2 + (TF2t+TF2)^n2) * (1 + R1/Kmi2)) + s2 - lambda;
 


Funktion 2 (nur lambda ist unterschiedlich) - singlekin_apc.m:
Code:

function dydt = singlekin(t,y)

dydt=zeros(size(y));

Vm1 = 3600;
n1 =2.7;
s1 =11;
Km1 = 3600;
Kmi1 = 5000;

Vm2 = 12300;
n2 = 3.4;
s2 = 10;
Km2 = 60000;
Kmi2 = 20000;

lambdatag = .231;
lambda = .0034;

TF1t = y(1);
TF2t = y(2);
TF1 = y(3);
TF2 = y(4);
R2 = y(5);
R1 = y(6);


dydt(1) = Vm1*(TF1t+TF1)^n1 / ((Km1^n1 + (TF1t+TF2)^n1) * (1 + R1/Kmi1)) + s1 - lambdatag;
dydt(2) = Vm2*(TF2t+TF2)^n2 / ((Km2^n2 + (TF2t+TF2)^n2) * (1 + R2/Kmi2)) + s2 - lambdatag;
dydt(3) = Vm1*(TF1t+TF1)^n1 / ((Km1^n1 + (TF1t+TF2)^n1) * (1 + R1/Kmi1)) + s1 - lambda;
dydt(4) = Vm2*(TF2t+TF2)^n2 / ((Km2^n2 + (TF2t+TF2)^n2) * (1 + R2/Kmi2)) + s2 - lambda;
dydt(5) = Vm1*(TF1t+TF1)^n1 / ((Km1^n1 + (TF1t+TF2)^n1) * (1 + R1/Kmi1)) + s1 - lambdatag;
dydt(6) = Vm2*(TF2t+TF2)^n2 / ((Km2^n2 + (TF2t+TF2)^n2) * (1 + R1/Kmi2)) + s2 - lambdatag;
 


Datei für die Lösung:
Code:

[t,y] = ode45(@singlekin,[0 80],[20 0 0 0 0 0]);

plot(t,y)
legend('TF1t','TF2t','TF1','TF2','R2','R1')

z = [y(105, 1) y(105, 2) y(105, 3) y(105, 4) y(105, 5) y(105, 6)];

[t,y] = ode45(@singlekin_apc,[0 15],z);

plot(t,y)
legend('TF1t','TF2t','TF1','TF2','R2','R1')
 


Ich wüsste nur zu gerne wo mein Fehler liegt. Sollte jemand eine elegantere Lösung für mein Problem kennen, würde ich mich sehr darüber freuen. Bin leider Matlab-Anfänger und muss mir das mehr oder weniger selbst beibringen.
Vielen Dank schon mal für eure Hilfe!

Gruß,

Martin
Private Nachricht senden Benutzer-Profile anzeigen


nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 12.05.2008, 10:25     Titel:
  Antworten mit Zitat      
Hi,

hab es nur kurz überflogen, die Vorgehensweise an sich ist schon richtig.
Du rufst einmal singlekin_apc.m auf, die Funktion heißt aber singelkin.
Versuch doch mal das in singlekin_apc zu ändern (das ist so auch empfohlen).
Vielleicht kommt Matlab mit der gleichlautenden singlekin.m durcheinander.
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 12.05.2008, 16:38     Titel:
  Antworten mit Zitat      
Moin,

ich hab das in der Regel so gehandelt, dass ich in einer if-Abfrage den aktuellen Zeitwert mit den Vorgaben verglichen hab und daraufhin die Konstante gesetzt.
Alternativ würde mir noch die switch-case-Abfrage in den Sinn kommen.
ungefähr so:
Code:
function dydt = singelekin(t,y)

swtich t
    case <=70
        lamda = ...;
    case <80
        lamda = ...;
    case >=80
        lamda = ...;

So spart man sich meiner Meinung nach 2 Funktionsaufrufe...

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
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.