| |
Diskrete und kontinuierliche Zeit
SIMULINK simuliert das Verhalten von Systemen in der Zeit, das Zeitintervall
über das sich die Simulation erstreckt, reicht per Default von 0 bis 10,
kann aber mit Hilfe von "Simulation -> Parameters" verändert
werden.
Im allgemeinen hat ein SIMULINK-Block die folgenden Eigenschaften:
- einen Eingabevektor u(t)
- einen Zustandsvektor x(t)
- einen Ausgabevektor y(t)
Im Verlaufe der Simulationszeit verändern sich die Werte dieser
Vektoren. Wenn sich x(t) und y(t) kontinuierlich ändern,
sprechen wir von einem Block mit kontinuierlichem Zeitverhalten oder
von einem kontinuierlichen Block. Wenn sich diese Werte nur zu
bestimmten, diskreten Zeitpunkten ändern, von einem Block mit
diskretem Zeitverhalten oder von einem diskreten Block. Die Änderungen
von Zustands- und Ausgabevektor nennen wir Ereignisse, die Zeitpunkte
der Änderungen entsprechend Ereigniszeitpunkte.
Beispiel 1
Das folgende Modell enthält:
- eine Signalquelle, die kontinuierlich ein Signal aussendet, der
Signalwert ist zeitabhängig, es git s(t) = t,
- einen Integrator, der kontinuierlich den Wert des eingehenden
Signales integriert und den momentanen Wert des Integrals
ausgibt. Wir gehen hier davon aus, dass der Integrator
kontinuierlich arbeitet, auch wenn er in der Praxis eine
numerische Integration mit diskreten Zeitpunkten durchführt,
das ist aber nur ein Zugeständnis an die numerische
Natur von Simulink und Matlab.
- einen Scope-Block, der den Wert seines Eingabesignals, also den
des Ausgabesignals vom Integrator, über das gesamte Zeitintervall
der Simulation aufzeichnet.
- einen Display-Block, der den Wert seines Eingabesignals am Ende
der Simulation anzeigt
Die Pfeile im Simulink-Modell zeigen ein logisches Nacheinander an,
das jedoch immer zum selben Zeitpunkt in der simulierten Zeit erfolgt.
Zum Zeitpunkt 5 hat das Ausgangssignal des Ramp-Blockes den Wert 5,
der Integrator addiert 5 dt zum Zustandsvektor x(t) und gibt den
momentanen Wert 25 aus, der Scope-Block zeigt den Graphen des Integrals
von 0 bis 5 an und im Display-Block erscheint der Wert 25 (zumindest
theoretisch).
Da wir den Simulationszeitraum bei 0 bis 10 gelassen haben, berechnet
dieses Modell das Integral von 0 bis 10 über t dt und liefert
am Ende im Display den Wert 50, im Scope den Graphen:
Beispiel 2:
Im folgenden Modell haben wir gegenüber Beispiel 1 nur den
zeitkontinuierlichen Integrator gegen einen zeitdiskreten Summierer
(Discrete Time Integrator) ausgetauscht. Zeitdiskret heisst dabei, dass
der Summierer nur zu bestimmten Zeitpunkten t0,
t1, t2, ... arbeitet. Zu diesen Zeitpunkten
wertet er das Eingangssignal aus, multipliziert es mit der Länge
des Zeitintervalles und addiert das Produkt zum momentanen Wert des
Zustandswertes, also zur momentanen Summe.
Die Blockparameter für den Summierer wurden auf den Default-Werten
gelassen:
Von Bedeutung sind davon im Moment:
- der Anfangswert (Initial condition) 0 des Summierers,
- Die Länge eines Zeitintervalles (Sample time), alle
Zeitintervalle haben die Länge 1.
- Die Summationsformel (Integration method), "Forward Euler" besagt,
dass die Summation nach der Regel:
xn+1 = xn + Zeitintervall * Eingangssignal
erfolgt. xn ist dabei der Summenwert vor der aktuellen
Summation, xn+1 der Summenwert danach. Zu beachten ist, dass
der Ausgabewert xn und nicht xn+1 ist.
Wir haben damit:
| tn |
Signalwert |
xn |
xn+1 |
| 0 |
0 |
0 |
0 |
| 1 |
1 |
0 |
1 |
| 2 |
2 |
1 |
3 |
| 3 |
3 |
3 |
6 |
| 4 |
4 |
6 |
10 |
| 5 |
5 |
10 |
15 |
| 6 |
6 |
15 |
21 |
| 7 |
7 |
21 |
28 |
| 8 |
8 |
28 |
36 |
| 9 |
9 |
36 |
45 |
| 10 |
10 |
45 |
55 |
Wählt man das Zeitintervall immer kleiner, so werden xn
von unten und xn+1 von oben gegen das Endergebnis von Beispiel 1
gehen. Für ein Zeitintervall der Länge 0.01 erhalten wir für
xn das Endergebnis 49.95.
Beispiel 3:
In diesem Beispiel ändern wir lediglich die Parameter des
Summierers.
Wir verwenden also beim Summierer den Anfangswert 0.5 und haben die
Sample time durch [1 0.5] angegeben. Der erste Wert 1 legt die
Länge der Zeitintervalle fest, der zweite gibt die Verschiebung
des ersten Ereigniszeitpunktes mit 0.5 an, die Ereigniszeitpunkte sind
damit: 0.5, 1.5, 2.5, 3.5, ... , 9.5.
Wir haben damit:
| tn |
Signalwert |
xn |
xn+1 |
| 0.5 |
0.5 |
0.5 |
1.0 |
| 1.5 |
1.5 |
1.0 |
2.5 |
| 2.5 |
2.5 |
2.5 |
5.0 |
| 3.5 |
3.5 |
5.0 |
8.5 |
| 4.5 |
4.5 |
8.5 |
13.0 |
| 5.5 |
5.5 |
13.0 |
18.5 |
| 6.5 |
6.5 |
18.5 |
25.0 |
| 7.5 |
7.5 |
25.0 |
32.5 |
| 8.5 |
8.5 |
32.5 |
41.0 |
| 9.5 |
9.5 |
41.0 |
50.5 |
Kontinuierliche und diskrete Blöcke können gemeinsam im
selben Modell vorkommen.
Der Scope-Block liefert für obiges Modell die folgende Ausgabe:
Das Zusammenspiel von Blöcken mit verschiedenenem Zeitverhalten
(multirate system) ist nicht immer so einfach zu erreichen wie im
obigen Beispiel.
Beispiel 4:
Wir wollen ein diskret arbeitendes System modellieren, bei dem einige
Ereignisse im Takt von einer Zeiteinheit, ein anderes aber nur zum
Zeitpunkt 0 stattfinden soll.
Als Beispiel verwenden wir den Prozess zur Generierung des folgenden
Diagrammes, das die Newton-Schritte zur Lösung eines
Gleichungssystems:
f1(x,y) = x^2 - 4y
f2(x,y) = 4x - y^2
bei verschiedenen Startwerten rund um die Nullstelle [0,0] zeigt. Zum
Zeitpunkt 0 soll das Achsenkreuz mit den Höhenlinien der Funktion
F(x,y) = f1(x,y)^2 + f2(x,y)^2
angelegt werden, zu jedem Zeitpunkt n soll ein Newton-Schritt berechnet
und in das Diagramm eingetragen werden. Da die Berechnung der Höhenlinien
aufwendig ist, ist von Bedeutung, dass dies nur einmal geschieht.
Wir modellieren zuerst den Prozess, bei dem keine Höhenlinien
erzeugt werden, dieser Prozess kann mit nur einer Taktrate arbeiten. Als
Taktgeber verwenden wir einen
Unit Delay Block, das ist ein
einfacher, diskret arbeitender Block, der zum Zeitpunkt tn+1
immer den Eingangswert vom Zeitpunkt tn ausliefert. Es gilt
also:
yn+1 = un
Wir versehen diesen Block mit:
- Anfangswert (initial condition) x-1 = 0
- Sample time T = 1
Dieser Block arbeitet in einer Schleife, in der zu jedem Zeitpunkt
der Ausgangswert um 1 erhöht und wieder als Eingangswert benutzt
wird. Der Block liefert also zum Zeitpunkt n den Ausgangswert n, wobei
n von 0 bis 16 läuft, was durch die Anfangs- und End-Zeit bei den
Simulationsparametern vorgegeben wird.
Im nachfolgenden Produktblock wird n in n*pi/8 transformiert und dann
zusammen mit dem Wert 0.5 (Radius um Nullpunkt) in die Matlab Fcn
eingespeist. Der Matlab-Code
des zugehörigen M-Files wird im Anhang wiedergegeben.
Die Höhenlinien werden ebenfalls mit Hilfe einer Matlab Fcn gezeichnet,
den zugehörigen Matlab-Code findet man wieder im Anhang. Diese
Matlab Fcn benötigt den Radius als Eingabewert und die naheliegenste
Formulierung ist daher:
Das hat aber den Nachteil, dass diese Matlab Fcn im selben Takt arbeitet
wie das ganze restliche System, die Höhenlinien werden 16 mal
berechnet und gezeichnet. Daran ändert sich auch nichts, wenn wir
die Höhenlinienien-Funktion vom Rest des Systems isolieren. Das
isolierte Teilsystem arbeitet trotzdem im selben Takt wie das Restsystem.
Unser Ziel erreichen wir nur, wenn wir dem Teilsystem explizit einen
eigenen Taktgeber mitgeben. Wir verwenden dazu eine
Discrete State-Space
Block, dessen Funktion aus seinem Icon hervorgeht.
Die Besetzung der Parameter dieses Blockes erfordert einige Sorgfalt, wenn die Parameterwerte Matrizen sind. In diesem Falle sind es jedoch Skalare und wir setzen A, B und C gleich 0, D gleich 1. Der Block gibt also zu jedem Zeitpunkt
sein Eingangssignal als Ausgangssignal weiter und hat keine andere Funktion, als den anhängenden Block zu takten. Die Taktzeit geben wir als Sample time im Parameterfenster mit 1000 an, da die Simulation nur bis 16 läuft, werden die Höhenlinien nur einmal gezeichnet, zum Zeitpunkt 0.
Überschaubar sind unterschiedliche Taktraten nur dann, wenn die
getakteten Subsysteme isoliert hinter dem jeweilig taktenden Block
stehen. Falls diese Subsysteme zusammenhängen ist es schwierig
zu durchschauen, welcher Block mit welcher Taktrate arbeitet. Die
folgenden Diagramme zeigen das System aus dem Anhang in verschiedenen
Varianten. Gegenüber dem bisherigen System kann man hier mehr
Eingabeparameter vorgeben, insbesondere kann man bei der Iteration
mehrere Schritte durchführen lassen (Schrittzahl).
Das nächste und übernächste Modell unterscheiden
sich nur dadurch, dass die Multiplikation mit pi/8 einmal ausserhalb
der Matlab-Function, das andere mal innerhalb der Matlab Function durchgeführt
wird, was merkwürdigerweise auf die Multirate Eigenschaft des
Systems auswirkt.
Wenn man 'Achsenkreuz' wieder direkt hinter den taktenden
Discrete State Block anfügt, erreicht man wieder das
gewünschte Multirate-Verhalten. Zu beachten ist, dass
die Parameter des Discrete State System Blockes
jetzt anders besetzt werden müssen.
- Der Eingangsvektor u hat die Länge 4 und soll
unverändert durchgereicht werden. D muss also eine 4*4
Einheitsmatrix sein und wir setzen deshalb D = eye(4,4).
- Der Zustandsvektor x ist ein Skalar, dessen Wert uns nicht
weiter interessiert, A muss deshalb eine 1*1, B eine 1*4 und
C eine 4*1 Matrix sein. Wir setzen A=0, B=zeros(1,4) und C=zeros(4,1).

Auf der sichereren Seite ist man allerdings, wenn man die beiden unterschiedlich
getakteten Subsysteme entkoppelt. Wir verwenden im folgenden Modell
zum Hochzählen der ässeren Schrittzahl ebenfalls einen
Discrete State System Block, den roten. Die Parameter dieses Blockes sind:
- A = eye(1,1)
- B = [0 0 0 0 0 1]
- C = [0;0;0;0;0;1]
- D = eye(6,6)
- Initial conditions: 0
- Sample time: 1
Die Parameter des grünen Diskrete State Space Blockes sind dagegen:
- A = eye(1,1)
- B = zeros(1,6)
- C = zeros(6,1)
- D = eye(6,6)
- Initial conditions: 0
- Sample time: 1000
|