[an error occurred while processing this directive]
SIMULINK: SubsystemeSubsysteme sind das Äquivalent zu den Unterprogrammen der üblichen Programmiersprachen. Große Modelle kann man durch Verwendung von Subsystemen vereinfachen und überschaubarer machen.Subsysteme lassen sich auch in anderen Modellen, in denen dieselbe Funktionalität erforderlich ist, einsetzen und ermöglichen so die Wiederverwendbarkeit einer einmal gemachten Arbeit. Zu diesem Zwecke können Anwender eigene Block Bibliotheken entwickeln. In unserem ersten Beispiel wollen wir eine Block Bibliothek mit zunächst zwei Subsystemen entwerfen, die wir in verschiedenen Modellen zur Überwachung der Integrationsverfahren benutzen wollen. Beispiel 1:Wir wollen das Anfangswertproblem:y' + 2*y = u(t) = sin(t); y(0) = 0mit verschiedenen, von Simulink angebotenen Lösungsverfahren über dem Intervall von 0 bi 20 lösen und dabei die von den Verfahren gewählten Schrittweiten sowie die Anzahl der Schritte anzeigen lassen. Die Gleichung liefert die Laplace-Transformierten: s*Y + 2*Y = U -> (s+2)*Y = U -> Y = (1/(s+2))*UWir können folglich zur Integration das folgende Modell verwenden:
Die Uhr (clock) liefert uns die simulierte Zeit zu den Ereigniszeitpunkten des Systems. Wenn wir dafür sorgen, dass diese genau durch die Integrationsschritte gegeben werden, können wir aus tk+1-tk die Länge der einzelnen Integrationsschritte bestimmen. Die Frage ist jetzt, wie erhalten wir die Differenzen der einzelnen Ereigniszeitpunkte? Wer jetzt an diskrete Blöcke wie z.B. den Unit delay Block denkt, liegt leider im allgemeinen falsch. Das Problem ist, dass wir bei diesem Block die blockeigene Taktvorgabe nicht ausschalten können. Zumindest akzeptieren die mir zugänglichen Simulink-Versionen bei diesem Block nicht den Sample time Wert -1. Damit ist dieser Block im allgemeinen für unser Problem ungeeignet. Was wir brauchen, ist ein Block, der uns zum Eingang uk+1 den Ausgang uk liefert, unabhängig davon, wie lange der Zeitabstand tk+1-tk ist. Dies macht der Memory Block den man in Simulink 3 in der Continous Library findet, nicht aber der Unit delay Block. Wir erhalten damit:
Die nachfolgenden Bilder zeigen:
Erzeugen von Subsystemen: Die Blöcke zur Bestimmung der Schrittweite wollen wir nun in ein Subsystem umwandeln, wobei wir den Scope-Block nicht mit in das Subsystem nehmen. Dazu markieren wir die betreffenden Blöcke mit der Maus:
Mit dem Modell selbst können wir arbeiten wie gewohnt. Wir wollen nun den Subsystemblock umbenennen. Es gibt eine ganze Reihe von Möglichkeiten dazu, auch zur graphischen Umgestaltung des Icons. Wir beschränken uns im Moment aber auf folgendes Verfahren:
Unser Modell mit dem Subsystem sieht jetzt wie folgt aus:
Als weitere Aufgabe wollten wir ein Subsystem konstruieren, das uns die Anzahl der Integrationsschritte unseres Systems angibt. Im Grunde ist das ganz einfach. Zu jedem Ereigniszeitpunkt des Systems muss ein Zustandswert um 1 hochgezählt werden. Wiederum müssen wir hier einen Block wählen, der die Ereigniszeitpunkte des Systems übernimmt und keine eigenen Ereigniszeitpunkte hervorruft, da die Blöcke aus der 'Discrete Library' alle mit eigener Taktzeit arbeiten, sind diese ungeeignet und wir modellieren den Zähler deshalb wieder mit einem Memory Block. Als Startwert (Initial condition) dieses Blockes müssen wir -1 wählen, weil wir die Anzahl der Schritte und nicht die um 1 höhere Anzahl der Ereigniszeitpunkte zählen wollen. Wir kommen damit zum folgenden Modell:
Wir können nun auch die Anzahl der durchgeführten Integrationsschritte mit den verschiedenen Integrationsverfahren ermitteln. Für die oben betrachteten Verfahren haben wir:
Bibliotheken:
Für die meisten Zwecke würde es genügen, unsere Blöcke einfach in
einem eigenen Modell aufzubewahren, aus dem wir sie bei Bedarf in andere Modelle
kopieren.
Zum Anlegen einer neuen Bibliothek gehen wir wie folgt vor:
Beispiel 2:Als Anwendung unserer Bibliothek wollen wir auf das Problem eingehen, was passiert, wenn dem Modell aus Beispiel 1 noch eine Block mit eigener Taktung hinzugefügt wird. Wir verwenden dazu eine isolierte digitale Uhr und öffnen dazu:
Zur Simulation verwenden wir dieselben Parameter wie in Beispiel 1, die 'sample time' der digitalen Uhr setzen wir auf 0.2. Mit dem Dormand-Prince Verfahren erhalten wir dann das folgende Bild für die Schrittweiten, wobei hier 202 Integrationsschritte anstelle der 145 in Beispiel 1 durchgeführt wurden.
Am einfachsten sehen wir das an unserem Test-System:
simout =
0 0 0 0
1.0000 0.0300 0.0300 0.0004
2.0000 0.0601 0.0300 0.0017
3.0000 0.0994 0.0393 0.0046
4.0000 0.1478 0.0484 0.0099
5.0000 0.2000 0.0522 0.0175
6.0000 0.2654 0.0654 0.0295
7.0000 0.3395 0.0741 0.0461
8.0000 0.4000 0.0605 0.0614
9.0000 0.4919 0.0919 0.0874
10.0000 0.6000 0.1081 0.1210
11.0000 0.7144 0.1144 0.1589
12.0000 0.8000 0.0856 0.1880
13.0000 0.9558 0.1558 0.2409
14.0000 1.0000 0.0442 0.2556
....... ...... ...... ......
woran wir sehen, dass die Schrittweite anfangs wächst und sich
dann auf einen Zwischenschritt zwischen den durch die digitale Uhr
vorgegebenen Ereigniszeitpunkten einpendelt.
Beispiele wie dieses sollen nicht dazu anregen, möglichts komplizierte Modelle zu konstruieren, sondern darauf aufmerksam machen, dass durch einfache Änderungen am Modell völlig neue Situationen entstehen, die nicht miteinander vergleichbar sind. Im folgenden Beispiel verwenden wir Subsysteme um eine große Anzahl gleichartiger Blöcke mit wenig Aufwand zu konstruieren. Das Grundprinzip sind dabei Hierarchien von Subsystemen.
Beispiel 3:Unsere beiden bisherigen Subsysteme kamen ohne Eingabesignale und ohne eigene Parameter aus. In diesem Beispiel wollen wir einen Block mit beidem generieren.
Beispiel 4:Elektrische Leiterbahnen werden häufig durch eine Serie kleiner Widerstände und Kapazitäten beschrieben.
Ein Glied einer solchen Reihe, bestehend aus einem Widerstand und einer Kapazität nennen wir ein RC-Glied.
Der Strom durch einen Widerstand zwischen Knoten k-1 und k ist: iRk = G*(phik-1(t)-phik(t))der durch eine Kapazität zwischen Knoten k und Erde: iCk = C*phik'(t)wobei wir die Vorzeichen auch anders hätten wählen können. Da die Summe der Ströme durch einen Knoten 0 sein muss, haben wir für einen Knoten, der nicht am Ende einer Reihe von RC-Gliedern liegt: G*(phik-1(t)-phik(t)) = G*(phik(t)-phik+1(t)) + C*phik'(t)oder: (1) C*phik'(t) + 2*G*phik(t) = G*(phik-1(t)+phik+1(t))und für den letzten Knoten in der Reihe: G*(phin-1(t)-phin(t)) = C*phin'(t)oder: (2) C*phik'(t) + G*phik(t) = G*phik-1(t)Wir wollen mit einer Reihe von RC-Gliedern einen Prozess simulieren, bei dem zur Zeit t < 0 alle Knoten k die Spannung phik=0 haben. Zum Zeitpunkt 0 werde dann an Knoten 0 die Spannung u(t)=1 angelegt. Die Fragestellungen sind:
Gleichung (1) und (2) lassen sich durch Transfer Blöcke simulieren, wobei:
Die RCLib-Bibliothek benötigen wir natürlich zum Kopieren der (RC)1R-Blöcke, aber auch beim Simulationslauf. Sie muss deshalb entweder in unserem Arbeitsverzeichnis liegen oder aber über den Matlab Suchpfad erreichbar sein, ist das nicht der Fall, so müssen wir sie mit Hilfe des Befehls addpath Verzeichnisname wenigstens temporär in den Pfad eingliedern. Benötigte aber nicht auffindbare Bibliotheken werden bei der Simulation häufig durch Bad Link in den Block-Icons angezeigt.
Einfacher ist es da, hierarchisch gegliederte Subsysteme mit 2, 4, 8, ... RC-Gliedern aufzubauen. Hierarchisch gegliederte Subsysteme sind im Simulink möglich. Wir öffnen ein neues Modell-Fenster und kopieren die beiden (RC)1R-Blöcke einschließlich des Mux-Blockes in dieses Fenster. Der vordere (RC)1R-Block hat keine Rückkopplung zu seinem Vorgänger, da es diesen nicht gibt. Wenn wir den neuen Block aber hinter einem anderen Block verwenden wollen, brauchen wir diese Rückkopplung und folglich einen entsprechenden Ausgang im Subsystem. Außerdem sind nach dem Kopieren meist einige kosmetische Korrekturen am Modell notwendig. Nachdem dies alles getan ist, sieht unser Subsystem wie folgt aus:
Wie man sieht, zeigen die beiden Integrationsverfahren ein deutlich verschiedenes Schrittweitenverhalten. Bei kürzeren Integrationintervallen ist das Dormand-Prince Verfahren bezüglich des Aufwandes im Vorteil, bei längeren das ODE15s-Verfahren. Wir werden sehen, dass dies eine typische Situation für ein 'steifes Problem' mit einer Transientenphase ist. | |||||||||||||||||||||||||||||||