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

Zeitpunkt ab dem ich eine Funktion kaum noch ändert

 

Sewing
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2010, 13:28     Titel: Zeitpunkt ab dem ich eine Funktion kaum noch ändert
  Antworten mit Zitat      
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


Wäre super wenn da jemand ne Idee hätte!


Vielen Dank schonmal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

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:
Code:
find(abs(y-y(end))> tol, 1, last) + 1


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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2010, 16:22     Titel:
  Antworten mit Zitat      
Hallo!

Danke schon mal

kann ich denn bei Finden dieses Wertes das öen einer anderen DGL starten?

Also sozusagen den Startschuss für die 2. DGL geben?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2010, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

bevor ich das beantworte, sag doch bitte, welchen der beiden Wege du gehen willst Wink 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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2010, 17:50     Titel:
  Antworten mit Zitat      
Ja genau!

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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Sewing
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2010, 12:21     Titel:
  Antworten mit Zitat      
Okay alsoo danke schonmal!

Ich habe also in die options meines ode45 nen event geschrieben und dazu noch eine function die "event" heisst!


Aber was muss da jetzt rein damit die erste ode fct terminiert wird und die lösung der 2. gestartet wird?


finde in der Hilfe kein Anwendungsbeispiel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.01.2010, 13:16     Titel:
  Antworten mit Zitat      
Hallo,

passende Auszüge aus der Hilfe:

Zitat:
options:
Structure of optional parameters that change the default integration properties. This is the fourth input argument.

[t,y] = solver(odefun,tspan,y0,options)

You can create options using the odeset function. See odeset for details.


Unter odeset dann scrollen:
http://www.mathworks.com/access/hel.....f/odeset.html#f92-1017470

oder ein ausführlicheres Beispiel:
http://www.mathworks.com/access/hel...../f1-662913.html#f1-669698

Eine andere Strategie wäre, alles in einer Funktion unterzubringen und mit einer statischen Variablen zu arbeiten. In etwa so:

Code:
function dy = fun(t, y)

persistent mode
if ~exist('mode', 'var')
mode = 1; % Anfang: aufheizen
end

switch mode
case 1
% Aufheizphase. Unter best. Bedingung wird in die Abkühlphase geschaltet ( = mode auf 0 setzen)

case 0
% Abkühlphase. Unter best. Bedingung wird in die Aufheizphase geschaltet ( = mode auf 1 setzen)
end
 


Grüße,
Harald[/quote]
Private Nachricht senden Benutzer-Profile anzeigen
 
Sewing
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2010, 14:03     Titel:
  Antworten mit Zitat      
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!


Hier mal der bisherige Code

Code:

function masse_3
%--

global rho boltzmann A m c y0 V x lambda A2

rho=1.3;
boltzmann = 5.670*10.^-8;
A=1*0.5;
V=1.88*2.2*1.9;
m=rho*V;
c=1000
T0=293;
A2=1.2*0.25
x=0.005
lambda=1.16


y0=[293, 293];
tspan=[0,45*100];


options = odeset('RelTol',1.0e-6);

[t,y] = ode45(@temperatur, tspan, y0, options);

plot(t,y(:,1),t,y(:,2));



function dz = temperatur(t,z)
global rho boltzmann A m c V x lambda A2

dz(1,1)=(boltzmann*A*(z(2).^4-z(1).^4)-(lambda*A2)/x*(z(1)-293))/(c*m);  %Raumtemperatur

if t<=4500 & t>3000
 
      dz(1,1)=-(lambda*A2)/x*(z(1)-293)/(c*m);
  end

dz(2,1)=(5000-boltzmann*A*(z(2).^4-z(1).^4))/(c*m);           %Ofentemperatur
 


geplottet sieht das so aus

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sewing
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2010, 21:30     Titel:
  Antworten mit Zitat      
Hallo nochmal!


Also ich versuche jetzt mal das ganze Event Ding von Grund auf zu verstehen!



Ich habe eine einfache ODE 1. Ordnung die mir einen Fall simuliert



Code:

function fallschirm

y0 = 0;
tspan = [0, 60];

options = odeset('RelTol',1.e-6,'AbsTol',1.e-6);
[t,y] = ode45(@funk, tspan, y0, options);


plot(t,y);


function dy = funk(t,y)
g=9,81;
m=80;
k=2;

dy = -g+k/m*y;

 




Jetzt möchte ich die Event function implementieren um zu erreichen, dass etwas weiteres geschieht, sobald die dgl einen gewissen Wert erreicht hat!


Wie lege ich das denn jetzt konkret fest?

implementiert sieht die event function dann so aus

Code:


function fallschirm

y0 = 0;
tspan = [0, 60];

options = odeset('RelTol',1.e-6,'AbsTol',1.e-6,'Events',@events);
[t,y] = ode45(@funk, tspan, y0, options);


plot(t,y);



function [value,isterminal,direction]=events(t,y)
%-- Eventfunktion, stopt Integration bei Zusammenstoÿ
g=9,81;
m=80;
k=2;
%--
isterminal = 0; % stoppe Simulation
direction = 1; % nur bei fallender event-Funktion

value=10;




function dy = funk(t,y)
g=9,81;
m=80;
k=2;

dy = -g+k/m*y;

 



Was genau muss ich jetzt in der event function einstellen?

Ich verstehe die 3 Parameter dort einfach nicht =/

danke schon eimmal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.01.2010, 22:34     Titel:
  Antworten mit Zitat      
Hallo,

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


Und Achtung: . als Dezimaltrennzeichen verwenden, z.B. bei 9.81 (nicht 9,81!!)

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2010, 11:38     Titel:
  Antworten mit Zitat      
Vielen Dank Harald!

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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.01.2010, 18:44     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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
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 - 2025 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.