Verfasst am: 22.01.2010, 13:28
Titel: Zeitpunkt ab dem ich eine Funktion kaum noch ändert
Hllo Leute ich habe ein für euch wahrscheinlich leicht zu lösendes Problem!
Es geht darum dass ich eine steigende E funktion habe (ist ne ODE 1. Ordnung) nun nähert diese sich nach einer gewissen Zeit asymptotisch einem Endwert an.
Jetzt möchte ich ein "Toleranzband" festlegen, das heisst wenn zwei aufeinanderfolgende Werte zu den Zeitpunkten n-1 und n beide in dieses Toleranzband fallen, soll etwa geschehen.
Also im Prinzip ein ständiger Vergleich des aktuellen Wertes mit seinem vorhergehenden. Falls diese DIfferenz < als ein festgelegter Wert ist, soll ein anderes Ereigni beginnen.
Verfügt Matlab über so ein Tool dieser Art?
Ich habe mir schon etliche Gedanken gemacht:
Vergleichopereatoren usw,, aber weiss nicht wie ich konkret Werte zu den zeitpunkten aus der Funktioon auslese bzw, vergleiche
ich verstehe die Aufgabenstellung nicht ganz. Möchtest du diese Analyse durchführen, während die DGL gelöst wird (und ggf. aufhören zu rechnen) oder möchtest du die Analyse anschließend durchführen?
Im ersteren Fall: du kannst über Events (zu setzen über odeset) abfragen, wenn die Ableitung unter einen bestimmten Wert fällt.
Im letzteren Fall, mit y als Lösung und tol als erlaubte Abweichung:
bevor ich das beantworte, sag doch bitte, welchen der beiden Wege du gehen willst Ich gehe mal davon aus, dass es der erste Fall ist:
Bei Eintritt des "Events" wird das Lösen der ersten DGL beendet, d.h. die Kontrolle wird an das aufrufende Skript/Funktion zurückgegeben. Dort muss dann der Aufruf für die 2. DGL erfolgen.
Also es geht ganz konkret um die Simulation eines Saunaaufgusses!
Durch DGLs sind dei raum sowie die Ofentemperatur dargestellt!
Beide Temperaturen streben einem Endwert zu, und wenn sich dieser eben kaum noch ändert, soll ein "Aufguss" erfolgen! (Also das einetzen einer weiteren DGL!
mh also ich habe jetzt folgenden Code und möchte eben erreichen, dass der Saunaaufguss (erfolgt bisher nach 3000 Sekunden durch ne If Abfrage), automatisch einsetzt wenn die Raumtemperatur zum Zeitpunkt t(n) und die Temperatur zum Zeitpunkt t(n-1) nur noch 0.1 Grad auseinander liegt!
grün ist die Ofentemperatur und blau ist die Raumtemperatur
der eigentliche Aufguss wird simuliert durch ein Wegfallen der Wärmestrahlung des Ofens in den Raum für die bestimmte Zeitspanne, weil sämtliche Wärmeenergie in den Wasserverdampfungsprozess übergeht
man muss eigtl nur die Doku dazu lesen, siehe Link.
Zitat:
value(i) is the value of the ith event function.
isterminal(i) = 1 if the integration is to terminate at a zero of this event function, otherwise, 0.
direction(i) = 0 if all zeros are to be located (the default), +1 if only zeros where the event function is increasing, and -1 if only zeros where the event function is decreasing.
Mit anderen Worten:
Code:
function[value,isterminal,direction]=events(t,y)
%-- Eventfunktion, stopt Integration bei Zusammenstoß
g=9.81;
m=80;
k=2;
%--
isterminal = 1; % es soll ja gestoppt werden!!
direction = -1; % weil es bei FALLEND sein soll
if y > -100% z.B. Schwellwert -100
value = 1; % nicht stoppen else
value = 0;
end
Also entscheidet value=1/0 darüber wann das event geschieht ja?
Ich habe jetzt soweit lles in mein Script implementiert aber wie erreiche ich denn ejtzt dass bei value=0, also überschreiten des Schwellwertes etwas weiteres geschieht? Ab diesem Zeitpunkt möchte ich eine andere DGL lösen lassen. WIe muss ich die dorthin schreiben? und muss ich alle Startwerte dort wieder mit reingeben?
Als ich die DGLL die ich jetzt lösen möchte unter das value=0; geschrieben habe änderte sich gar nichts an der Lösung bzw. dem Plot!
Also entscheidet value=1/0 darüber wann das event geschieht ja?
Genauer gesagt: ungleich 0 oder 0. Lies doch bitte einfach die entsprechenden Teile der Doku, ich gebe ja schließlich auch nur das wieder, was da drin steht.
Zitat:
Als ich die DGLL die ich jetzt lösen möchte unter das value=0; geschrieben habe änderte sich gar nichts an der Lösung bzw. dem Plot!
Wie soll das auch gehen?!
Bei value = 0 wird in meinem Beispiel die Lösung der DGL abgebrochen. Eine andere Möglichkeit gibt es auch nicht, wenn du zu einer anderen Funktion springen möchtest.
Letztlich heisst das, du musst das letzte Paar (t, y) als Anfangsbedingung der nächsten DGL nehmen und diese in einem weiteren ode45-Aufruf lösen.
Grüße,
Harald
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.