Hallo,
ich möchte diverse ODE's lösen und brauche zu jeder 6. Minute eine Lösung. Ich brauche diese Lösung während der Iteration, da mit der Lösung im gleichen ode Function-File weitergerechnet wird. Deswegen ist eine spätere Interpolation der Daten nicht möglich.
Ich dachte ich könnte über odeset events definieren. Leider hab ich noch nie mit events gearbeitet und das ganze funktioniert nicht.
function[value,isterminal,direction] = event(t,x) % value = eval(sprintf('%.4f',sin(pi*t/0.1)));
value = floor(t/0.1)-t/0.1
isterminal = 0;
direction = 0;
end
Ich hatte erst versucht über einen sinus(pi*t/0.1) alle 6 min (0.1h) einen Iterationswert zu erhalten. Zu Beginn klappt das nicht gegen Ende der Zeit erfolgt tatsächlich zu jeder 6 min eine Iteration.
Die zweite Variante mit value = floor(t/0.1)-t/0.1 funktioniert noch weniger.
Ist das was ich machen möchte über events überhaupt möglich? Was mache ich falsch?
Gibt es vielleicht eine einfachere/bessere Methode für mein Problem?
Wie gesagt, ich brauch den Wert alle 6 Minuten. Nach 6 Minuten jeweils abzuwarten bis ein neuer Wert geschreiben wird geht leider auch nicht. Dann hätte ich z.B. Werte bei 6,02 oder 6,4 oder 7 min.
das hab ich noch nie gemacht. Ich könnte es versuchen, aber auf den ersten Blick finde ich das relativ kompliziert. Ich denke die Umsetzung ist nicht so schwer, aber ich habe Bedenken, dass ich mir so nur noch weitere Baustellen schaufel.
Bin ich den mit events über odeset ganz auf dem falschen Weg? Ich hatte es eig so verstanden, dass man damit verhindert, dass der solver auf Grund der Schrittweise über ein Event hinweg läuft. Mein Event wäre eben einfach jede 6. Minute. Ansatzweise hatte ich das ja mittels Sinus hin bekommen. Ich hatte gehofft nur die events Funktion nicht ganz richtig verwendet oder verstanden zu haben.
deine Beschreibungen wie "funktioniert nicht" und "funktioniert nicht weniger" sind leider nicht hilfreich.
Je genauer du beschreibst, was du machst und warum es nicht funktioniert, desto eher kann man dir helfen.
Was ist denn die Grundeinheit deiner Zeitskala?
Wie genau verwendest du den Wert zu jeder 6. Minute denn in der Funktion?
%cSLraman = cSL(t%6=0) = x(t) % hier soll später alle 6 min der Wert übergeben werden. Über global würde ich diese dann bis zur nächsten Übergaben speichern
%FR soll falls außerhalb seiner Grenzen auf min bzw. max gesetzt werden
% FR(t) = y(t);
y(9) = y(7);
if y(7)<=p(6);
y(9) = p(6);
elseif y(7)>=p(5)
y(9)=p(5);
end
value = floor(t/0.1)-t/0.1 führt dazu das nur zu 2 Zeitevents auch eine Iteration sattfindet: te = [ 5,55111512312578e-17; 15 ]
Mit werden mehr Events erkannt, jedoch auch nicht alle und die meisten doppelt: te = [1,59154943160541e-06; 0,299998408450586; 0,300001591549439; 1,99999840845057; 2,00000159154945; 3,49999840845062; 3,50000159154952; ...; 14,0000015915496; 14,8999984084507]
Bzw. stelle ich momentan fest, das in dem Vektor te zwar glatte Zahlen (z.B. 0,3000) angezeigt werden, jedoch aber eig Zeiten kurz bzw nach z.B. 0,3 gespeichert werden. Vielleicht bekommt Matlab die glatten Zahlen nicht hin. Hab ich erst jetzt festgestellt, dass nach Kopieren Einfügen die 0,3000 zur 0,299998408450586 wird.
Ich hoffe damit ist klar was ich mache.
Zeiteinheit ist Stunden. Das heißt die 6. Minute ist die 0.1 Stunde.
Der Wert der dann jede 6. Minute iteriert wird (bzw werden soll) soll dann in einer globaelen Variablen gespeichert werden und dann 6 Minuten lang verwendet werden. Dann käme der nächste Wert.
Um ganz genau zu sein, geht es um eine Simulation einer Konzentrationsregelung. Die Messung liefert aber nur alle 6 Minuten einen Wert der Konzentration.
Der Wert der dann jede 6. Minute iteriert wird (bzw werden soll) soll dann in einer globaelen Variablen gespeichert werden
Globale Variablen würde ich grundsätzlich vermeiden. Ich glaube, dass mein Vorschlag, die Simulation alle 6 Minuten neu zu starten, deutlich leichter umzusetzen und zu debuggen wäre und zudem übersichtlicher.
% Algebraische Ergebnisse for n=1:length(tsimi)
ysimi(n,:) = Glycerol_mod (tsimi(n,1), xsimi(n,:), pk, 2);
end
% Startwerte für ode Solver ändern sich für jeden Schleifendurchgang und % werden neu übergeben
x0(1) = xsimi(end,1); % cXL0 [g/l]
x0(2) = xsimi(end,2); % cSL0 [g/l]
x0(3) = xsimi(end,3); % VL0 [l]
x0(4) = xsimi(end,4); % yI0 [l/(hh)]
% Für alle Schleifendurchgänge außer dem letzten wird die unterste % Ergebniszeile gelöscht if i<pk(32)/pk(12)
tsimi(end)=[];
xsimi(end,:)=[];
ysimi(end,:)=[];
end
Vielleicht ist der Code auch mal für jmd. hilfreich der ein ähnliches Problem hat.
Gruß Roman
Einstellungen und Berechtigungen
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
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.