[an error occurred while processing this directive]
Bestimmung von EreigniszeitpunktenBei der Simulation eines dynamischen Systems reicht es nicht aus, die durch das Modell vorgegebenen Differentialgleichungen zu lösen. In den meisten Fällen müssen auch Zeitpunkte von Ereignissen bestimmt werden, etwa wann eine Zustandsvariable eine Nullstelle passiert oder wann bei Zustandsvariablen Unstetigkeiten auftreten.Simulink versucht in jedem Integrationsschritt solche Ereignisse zu erkennen. Die dazu benutzte Technik wird zero crossing detection (ZCD) genannt. Man kann diese Eigenschaft im Fenster Simulation -> Parameters -> Diagnostics ein- und ausschalten, was sich natürlich auf die Genauigkeit der Ergebnisse erheblich auswirken kann.
Beispiel 1:Das folgende Modell dient zur Integration der Differentialgleichnung y'=-y mit dem Anfangswert y(0)=1. Das Ausgabesignal y(t) wird jeweils mit dem Testwert 1.0e-3 verglichen. Relational Operator-Blöcke arbeiten mit ZCD, der Wert von T=-log(1.0e-3) wird also möglichst genau festgestellt. Da die Lösung des Problems monoton fallend ist, hat das Ausgangssignal des Vergleichsblockes hat bis zum Zeitpunkt T den Wert 0, danach den Wert 1. Dieses Signal triggert ein Subsystem, das lediglich aus einer Leitung besteht. Nur zum Zeitpunkt T wird also ein Signal durchgelassen, es hat den Wert T. Im Fehler-Block wird der Wert u + log(1.0e-3) berechnet und im Display-Fenster ausgegeben. u ist der Eingangswert des Fehler-Blockes, also der numerisch berechnete Wert von T, -log(1.0e-3) ist der exakte Wert von T.
Das Problem, die Zeitpunkte von Nullstellen der Zustandsvariablen zu bestimmen, hat nichts mit der numerischen Integration des vorgegebenen dynamischen Systems zu tun, ist aber in die Integratoren mit variabler Schrittweite eingebaut. Wenn diese in einem Integrationsschritt einen Vorzeichenwechsel erkennen, wird die Nullstelle genauer bestimmt, sofern entsprechende Blöcke vorhanden sind, die dies anfordern und ZCD eingeschaltet ist. Diese Integratoren ersetzen dabei auch den betreffenden Integrationsschritt durch einige kürzere Integrationsschritte, vermeiden jedoch die Nullstelle als Integrationsstützpunkt. Es gibt also eine Verzahnung zwischen den Integratoren mit variabler Schrittweite und ZCD. Die Integratoren mit fester Schrittweite kennen keine ZCD, obwohl man die betreffenden Optionen im Parameterfenster auch hier an- bzw. ausklicken kann. Das Schrittweitendiagramm zeigt, daß daß die Schrittweite zum Zeitpunkt T deutlich einbricht.
Beispiel 2:Das nachfolgende Modell liefert die Lösung des Anfangswertproblemes y'(t)=-sign(y(t-1)-0.5)*y(t), y(0)=1. Die Simulation erfolgt mit dem Dormand-Prince-Verfahren ode45 mit Default-Parameterwerten über dem Intervall 0 bis 4.Für den Transport Delay Block sind Anfangswert 1 und Verzögerungszeit 1 vorgegeben. Numerisch ermittelt wird auch die erste Nullstelle der Funktion sign(y(t-1)-0.5), der Fehler gegenüber der exakten Nullstelle wird im Fehler-Fenster ausgegeben.
Zur Ermittlung der Nullstelle von y(t-1)-0.5 benutzt Simulink gespeicherte zurückliegende Werte. Es ist klar, daß die Nullstelle um so besser bestimmt werden kann, je besser diese Werte die Bestimmung der Nullstelle von y(t)-0.5 zulassen. Zur genauen Bestimmung dieser Nullstelle sind im obigen Modell aber keinerlei Vorkehrungen getroffen worden. Die ZCD im Sign-Block leidet daher unter schlechten Daten für ihre Aufgabe.
Im nachfolgenden Modell wird mit Hilfe eines
Hit Crossing-Blockes die Nullstelle von y(t)-0.5 genau bestimmt, was dazu
führt, daß auch die Nullstelle von y(t-1)-0.5 genauer bestimmt werden kann.
Als Parameter des HC-Blockes werden 'hit crossing offset'=0.5 und
'hit crossing direction'='either' vorgegeben und bestimmt allgemein Nullstellen
der Funktion 'Eingangssignal - hit crossing offset'. Anders als andere Blöcke
die mit ZCD arbeiten, wird die Nullstellenbestimmung beim HC-Block auch dann
durchgeführt, wenn ZCD global ausgeschaltet wurde.
Man erkennt daß:
Beispiel 3:Ein Gummiball wird aus einer Höhe von s(0)=10m mit einer Anfangsgeschwindigkeit von v(0)=15m/sec senkrecht nach oben geworfen. Der Einfluß des Luftwiderstandes werde vernachlässigt, so daß nur die Schwerkraft g=-9.81m/sec^2 auf den Ball einwirkt. Wir wollen zunächst Geschwindigkeit v(t) und Position s(t) modellieren und dabei annehmen, daß der Ball unbeschränkt tief fallen kann. Die Simulationsparameter belassen wir auf ihren Default-Werten (Solver=ode45, Relative Toleranz=1.0e-3, Absolute Toleranz=auto, Zero crossing detection=on).
Wenn wir bei den Simulationsparametern 'Zero crossing detection' abschalten, sonst aber alle Parameterwerte beibehalten, liefert das Modell als Abbruchzeit T=3.68 anstelle von T=3.6211169879495. Dieser Wert ändert sich natürlich, wenn wir andere Vorgaben für die Fehlertoleranz machen. Mit rel.tol.=1.0e-6 und abs.tol=1.0e-9 erhalten wir mit zero crossing detection den unveränderten Wert von T, ohne diese Eigenschaft jedoch: T=3.63365... Wir haben jetzt den Zeitpunkt T bestimmt, zu dem sich die Parameterwerte ändern. Die Frage ist nun, wie wir die Simulation mit den geänderten Parameterwerten fortsetzen können. Der Integrator-Block verfügt über einen Reset Port, mit dessen Hilfe man seine Zustandsvariablen, abhängig vom Wert eines externen Signales, auf seine Anfangswerte zu&ruuml;cksetzen können. Um diesen Port zu benutzen, müssen wir wir als Wert des Block-Parameters External reset einen von 'none' verschiedenen Wert vorgeben. Wir haben im folgenden Modell den Wert falling vorgegeben und das Signal s(t) zum triggern. Das heißt genauer: s(t) setzt die Zustandsvarible des Intergatorblockes Int. v(t) auf ihren Anfangswert, wenn s(t) eine Nullstelle vom Positiven aus erreicht.
In diesem Modell sind keine Blöcke enthalten, die eine genaue Bestimmung der Nullstellen der Lösung erzwingen würden. Es wird lediglich festgestellt, ob die Lösungen vom Positiven ins Negative geraten sind. Ist das der Fall, so wird eine neue Phase zum aktuellen Zeitpunkt gestartet, es wird aber nicht versucht, den Zeitpunkt des Nulldurchganges genauer zu bestimmen. Falls die Lösungswerte geringfügig ins Negative geraten, fällt dies insofern nicht auf, da die Anfangssteigung der neuen Phase wieder auf 15 (interner Parameterwert) gesetzt wird, was dafür sorgt, dass die Lösungswerte schnell wieder positiv werden. Tatsächlich benötigen wir für unser Problem eine variable Vorgabe der Anfangswerte für die jeweiligen Simulationsphasen, wobei diese mit der Zeit immer kleiner werden. Dazu setzen wir zunächst den Wert Initial condition source des Integrator-Blockes Int. v(t) von internal auf external, der Integrator-Block erhält dadurch einen dritten Eingang, über den wir die Anfangswerte der einzelnen Simulationsphasen vorgeben können. Wenn wir dort konstant den Wert 15 vorgeben, erhalten wir dieselben Ergebnisse wie bisher. Im folgenden Modell geben wir als Anfangswerte der einzelnen Phasen den Wert 10*exp(T) vor, wobei T der Zeitpunkt ist, zu dem die Phase beginnt.
Modell mit mehreren Phasen, variablen Anfangswerten und grober Bestimmung der PhasenendenDie Ergebnisse sind nicht brauchbar, da die Nullstellen des Ausgangssignales des Integrators Int.s(t) nicht genau bestimmt werden und die immer kleiner werdenden Anfangssteigungen der neuen Phasen irgendwann einmal nicht mehr ausreichen um die Lösungen wieder aus dem Negativen ins Positive zu führen. Konkret endet hier die Phase, die etwas vor 3.3 beginnt, soweit im Negativen, daß die nächste Phase keine positiven Werte mehr erreicht und dadurch auch kein Ende dieser Phase mehr festgestellt werden kann.
Mit der Vorgabe 'Max step size=001' anstelle der Vorgabe 'Max step size=auto' (bei 'rel.tol=1.0e-3, abs.tol=1.0e-6) schieben wir dieses Problem um viele Phasen bis nach 5.4 hinaus.
Die beiden anderen Punkte sind aufwendiger zu umgehen, wobei wir annehmen, daß beide zusammenhängen. Das Problem der algebraischen Schleife bei der Vorgabe von Anfangswerten ist jedoch so häufig, daß Simulink einen Ausweg dazu eingebaut hat und in der Warnung zur algebraischen Schleife auch darauf hinweist. Der Integrator-Block verfügt über einen Ausgang state port, den man zur Verfügung hat, sobald man im Parameterfenster 'Show state port' anklickt. Dieser Ausgang liefert zwar dasselbe Signal wie der normale Ausgang, vermeidet aber blockintern eine algebraische Schleife. Wir erhalten damit das nachfolgende Modell, das eine Lösung unseres Problems bis T=20 erlaubt.
Sollte Ihre Simulink-Version nicht den IC-Block beinhalten, so können Sie dessen Funktion z.B. mit folgendem Subsystem modellieren:
Beispiel 3:Wir betrachten erneut das Beispiel des elastischen Balles, nehmen zur Vereinfachung jetzt jedoch an:
Man kann sich leicht überlegen, daß unter diesen Bedingungen die Länge der k. Sprungphase den Wert 2*(0.8)^(k-1) hat, die Endzeitpunkte also bei 2.0, 3.6, 4.24, .... liegen und zur Zeit 10 einen Häufungspunkt haben. Wie gehen die einzelnen Integratoren mit dieser Situation um und welche Hinweise geben sie dem Anwender?
Dormand-Prince ode45 mit ZCD Abbruchszeit T: 10 + 1.009e-9 angezeigte Phasen: 790Integrationsschritte:
Dormand-Prince ode45 mit ZCD und Default-ParameterwertenSimuliert wurde von 0 bis 15, wobei die Simulation aber nach maximal 5000 Integrationschritten abgebrochen wurde. ZCD wurde sowohl bei v(t) als auch bei s(t) verlangt.Abbruchszeit T: 10 + 1.014e-9 angezeigte Phasen: 793Die geringeren Genauigkeitsanforderungen machen sich praktisch nicht bemerkbar.
Steifer Integrator ode15s mit ZCD Abbruchszeit T: 10 - 1.393e-6 angezeigte Phasen: 850ode15s findet in einem kürzeren Intervall mehr Sprungphasen als ode45. Integrationsschritte:
Dormand-Prince ode45 ohne ZCD Abbruchszeit T: 10 + 9.655e-5 angezeigte Phasen: 558Integrationsschritte:
Dormand-Prince ode45 ohne ZCD und Default-Parameterwerten Abbruchszeit T: 15 angezeigte Phasen: 8Ohne ZCD ist das Verfahren bei geringen Genauigkeitsanforderungen für dieses Problem ungeeignet, man erhält keinerlei Hinweise auf eventuelle Probleme. Phasenlängen:
Amplitudenquotient aufeinanderfolgender Phasen:
Steifer Integrator ode15s ohne ZCDSimuliert wurde von 0 bis 15, wobei die Simulation aber nach maximal 5000 Integrationschritten abgebrochen wurde. Als relative bzw. absolute Toleranzen wurden 1.0e-8 bzw. 1.0e-16 vorgegeben.Abbruchszeit T: 1.9999999 angezeigte Phasen: 1ode15s kommt ohne ZCD mit 5000 Integrationsschritten nur bis zur ersten Unstetigkeit. Es wir eine Warnung ausgegeben, daß möglicherweise eine Unstetigkeit vorliegt und die Lösung nicht mit der geforderten Genauigkeit ermittelt werden kann. Steifer Integrator ode15s mit Default-Parameterwerten, ohne ZCDSimuliert wurde von 0 bis 15, wobei die Simulation aber nach maximal 5000 Integrationschritten abgebrochen wurde.Abbruchszeit T: 15 angezeigte Phasen: 754Das Verfahren liefert keine Hinweise auf den Häufungspunkt bei T=10.
Integrationsschritte:
Dormand-Prince ode5Integratoren mit fester Schrittweite sind für dieses Problem ungeeignet, auch wenn die Ergebnisse mit kleineren Schrittweiten besser werden. Simuliert wurde von 0 bis 15 mit der Schrittweite 0.25.Abbruchszeit T: 15 angezeigte Phasen: 8Phasendiagramm:
Blöcke, die mit ZCD arbeiten
|