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

Kraft in DGL abhängig von Zeitschritt des ode-Löser...?

 

tud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2010, 14:14     Titel: Kraft in DGL abhängig von Zeitschritt des ode-Löser...?
  Antworten mit Zitat      
Ich habe eine lineare DGL. Auf der rechten Seite ist eine Kraft die abhängig von der Größe des Zeitschritts des ode-Lösers ist. Wie kann ich das über einen ode-löser meinem Skript zur Berechnung der Kraft mitteilen?

Der ode-Löser greift in einer Schleife mehrmals auf das Skript zur Berechnung der Kraft zu. Kann man sich den Zeitpunkt ausgeben lassen, an dem der ode-Löser in der Zeit fortgeschritten ist?

Ich habe schon mehrere Löser ausprobiert, schaff es aber nicht die Kraft korrekt zu berechnen.

Über Tipps würde ich mich freuen.
Gruß


Harald
Forum-Meister

Forum-Meister


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

ein ODE-Löser erwartet als rechte Seite ein Function Handle auf eine Funktion der Form
Code:
function y = rechteSeite(t, x)

t ist dabei die Zeit. Du müsstest sie also nur verwenden.
Falls das nicht hilft, poste doch vielleicht ein konkretes Beispiel.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2010, 15:02     Titel:
  Antworten mit Zitat      
Danke für die schnelle Anwort.
Meine rechte Seite sieht so aus:

Code:

function dx = daschw(t,x,S,K,)

M = [0; RS(x(1),zeitschritt)/S];

A = [0 1;-K/S -D/S];
dx = A*x + M;

end
 


In RS steht wiederrum die Vorschrift zur Berechnung der Kraft. zeitschritt ist die größe des Zeitschritts. Die Kraft bekomme ich aus einem externen Programm. Es handelt sich dabei um einen potentialtheoretischen Strömungslöser. Dieser berechnet die Kraft in Abhängigkeit von der Größe des Zeitschritts und deren "Geschichte". Wie könnte man das korrekt implementieren?
Vielen Dank schonmal.[/code]
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2010, 16:47     Titel:
  Antworten mit Zitat      
Ah, das hatte ich etwas falsch verstanden.
Die Länge des Zeitschritts lässt sich in der Tat nicht ohne weiteres verwenden. Mich erstaunt allerdings die Anwendung, da die Ableitung an einem Punkt in der Regel ja höchstens vom Zeitpunkt, nicht aber von der Länge des Zeitschritts abhängt.
Vielleicht lohnt es sich da, die Anwendung noch einmal zu überdenken.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2010, 18:21     Titel:
  Antworten mit Zitat      
Gibt es denn in Simulink solche Möglichkeiten? Oder arbeitet Simulink direkt mit den ode-Lösern, so dass man nicht wirklich mehr Probleme solcher Art lösen kann?
Grüße
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 01.04.2010, 12:16     Titel:
  Antworten mit Zitat      
Hallo,

hmm, in der Tat merkwürdig, dass der Zeitschritt eingeht. Das kann eigentlich nur den Grund haben, dass in der RS Funktion eine diskrete Ableitung berechnet wird. Diese sollte aber besser dann auch als Differentialgleichung formuliert werden.
Ein Versuch ist es wert, könnte aber unstabil sein: Du könntest den Zeitschritt ja leicht messen über
Code:

function dx = daschw(t,x,S,K,)
persistent lastTime
if isempty(lastTime)
  lastTime = -0.001; % oder sonst eine Schaetzung des ersten Zeitschritts
end
zeitschritt = t-lastTime;
M = [0; RS(x(1),zeitschritt)/S];

A = [0 1;-K/S -D/S];
dx = A*x + M;

% fuer den nächsten Schritt speichern:
lastTime = t;
end
 


Ciao,
Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
kepler
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 30.01.13
Wohnort: Darmstadt
Version: R2010a
     Beitrag Verfasst am: 31.01.2013, 17:08     Titel:
  Antworten mit Zitat      
Hallo liebe MATLAB-Gemeinde,
ich krame diesen alten Thread mal aus, weil ich derzeit vor genau dem gleichem Problem stehe.

In dem Anfangswertproblem (welches mit ode15s gelöst wird) steckt eine Subroutine. Und in dieser wiederum steht die zeitliche Ableitung einer Größe, für die ich wiederum den Zeitschritt bräuchte.

Macht man es so wie Titus es vorschlägt, sind negative Zeitschritte dabei, weil der Solver wohl ab und an zu einen Zeitschritt zurück geht. Ob das so vielversprechend ist weiss ich nicht (evtl. könnte man sich die letzten 5 oder 10 Zeitpunkte speichern, so dass irgendwann ein Zeitschritt positiv ist).
Einen festen Zeitschritt irgendwie erzwingen will ich nur ungern.

Hat vielleicht noch jemand eine andere Idee?

Grüße
kepler
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.01.2013, 18:50     Titel:
  Antworten mit Zitat      
Hallo kepler,

Auf jeden Fall bleibt bei der Integration mit einem ODE Solver ein prinziplielles Problem: Die Solver wurden für eine glatte rechte Seite konstruiert. Der Schrittweiten-Schätzer kann vollkommen scheitern, wenn die rechte Seite Diskontinuitäten aufweist. Und die Zeitschritte können nicht nur negative sein, wenn z.B. die Kontrolle des lokalen Fehlers einen Schritt verwirft, die rechte Seite wird auch noch für jeden Schritt mehrfach ausgewertet.

Matlab's ODE Solver mit Schrittweiten-Kontrolle, z.B. ODE45, sind also prinzipiell nicht zur Integration solcher Funktionen geeignet und die Verwendung führt zu sehr fragwürdigen "Ergebnissen", die man eigentlich nicht mehr als solche bezeichnen kann.

Wenn die rechte Seite wirklich von einem Zeitintervall abhängt kommt man um einen Integrator mit fester Schrittweite nicht herum. Man kann sich natürlich eine angepasste Version programmieren, die lokal die Schrittweite anhand der Diskretisierungsfehler verändert. Aber das ist nicht trivial.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
kepler
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 30.01.13
Wohnort: Darmstadt
Version: R2010a
     Beitrag Verfasst am: 01.02.2013, 17:57     Titel:
  Antworten mit Zitat      
Hm, schade :/

Aber vielen Dank für den Hinweis. Werde es mal mit einem (selbst geschriebenem) impliziten Euler probieren.

Gruß
kepler
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.