[an error occurred while processing this directive]
Subsysteme: InitialisierungBeispiel 1:Wir betrachten ein Problem mit einer vorgegebenen Anzahl von Anfangswertproblemen mit lineaeren Differentialgleichungssystemen. Die Anwender wählen eines davon aus und simulieren dieses dann. Ein derartiges Problem tauchte z.B. in Übung 6 auf.
Was zu tun bleibt ist, die Matrix im Matrix Gain-Block variabel zu besetzen. Der naheliegende Weg ist der, die Matrix im Parameterfenster des Matrix Gain-Blockes mit einem Variablennamen zu besetzen, etwa M, und diesem Namen dann im Parameterfenster des Subsystems eine Matrix als Wert zuzuweisen, wie wir dies bisher mit Skalaren gemacht haben. Das geht allerdings nicht. Simulink interpretiert die Variable im Matrix Gain-Block als skalare Variable und moniert einen 'Port mismatch' im System.
Das Problem der Fehlinterpretation der Variablen kann man beheben, indem man sie in der Form M(1:2,1:2) angibt, woraus hervorgeht, dass der Matrix-Gain-Block ein Signal u(t) mit 2 Komponenten erwartet und ein anderes y(t) mit 2 Komponenten ausgibt. Das Modell läßt sich jetzt problemlos simulieren. Lästig ist allerdings, dass man im Parameterfenster des Subsystem Blockes immer die ganze Matrix angeben muss, bei großen Matrizen ist das mühsam und fehleranfällig.
Diese Kommandos werden im Feld 'Initialization commands' abgelegt. Wir geben dort ein: switch n
case 1
M=[-1,0;0,-1];
case 2
M=[-1,0;0,-25];
case 3
M=[-1,0;+24,-25];
case 4
M=[-25,0;-24,-1];
end
Beispiel 2:Das Verhalten von Subsystemen lässt sich auf vielfältige Weise steuern. Wir betrachten dazu noch einmal das Problem, den Höhenlinienplot einer Funktion:f1(x,y) = x^2 - 4*y; f2(x,y) = 4*x - y^2;zu erzeugen, wobei die Höhenlinien zur L2-Norm: h(x,y) = sqrt( (x^2 - 4*y)^2 + (4*x - y^2)^2 );ausgegeben werden sollen. Diese Funktion hat eine Nullstelle in [0;0]. Der Höhenlinienplot soll um diese Nullstelle herum jeweils von -1.5*Radius bis +1.5*Radius gezeichnet werden, wobei Radius ein vom Benutzer vorzugebender Parameterwert ist. In den Höhenlinienplot sollen dann einzelne Newtonschritte eingezeichnet werden, die jeweils von einem Wert Radius*[cos(phi);sin(phi)] ausgehen, wobei phi in Schritten von pi/8 von 0 bis 2*pi läuft. Wir beginnen die Modellierung diesesmal mit einem Subsystem-Block aus der Signal- & Systems Bibliothek (Simulink 3):
function Niveau(Radius)
% Anlegen des Achsenkreuzes
axis(1.5*[-Radius,+Radius,-Radius,+Radius]);
% stets vorhandenes Achsenkreuz
hold on;
% Gitterpunkte definieren
[Xx,Yy] = meshgrid(-1.5*Radius:Radius/4:+1.5*Radius);
% L2-Norm der Funktionswerte
Z = sqrt((Xx.^2-4*Yy).^2 + (4*Xx - Yy.^2).^2);
% Zeichnung ausgeben
title('Parabelschnitt');
xlabel('Newton Verfahren');
contourf(Xx,Yy,Z,12);
Die Kommentare in dieser Datei, die jeweils mit % beginnen, sollten
zur Erklärung weitgehend ausreichen.
Die hold on Anweisung verhindert, dass die nachfolgende contourf Anweisung, das vorhandene Achsenkreuz mit einem eigenen Achsenkreuz überschreibt. [Xx,Yy] = meshgrid(-1.5*Radius:Radius/4:+1.5*Radius); erzeugt zwei 13*13 Felder mit den x- und y-Koordinaten, jeweils 13 Koordinaten in diesen Feldern sind gleich. Wir können unser Subsystem schon in diesem Zustand ausprobieren, erhalten allerdings eine Warnung, dass das Subsystem noch leer ist. Der Höhenlinienplot wird allerdings schon erzeugt. Beachten Sie, dass der Parameterwert von Radius als Argument von der Initialisierungsroutine Niveau verwendet wird.
function Iteration(phi,Radius) plot(Radius*cos(phi),Radius*sin(phi),'ro');Wir können an dieser Stelle wieder den vertrauten Namen phi für das erste Funktionsargument verwenden und sind nicht gezwungen, einen vorgegebenen Namen zu verwenden, wie das im Parameter-Fenster des MATLAB Fcn-Blockes der Fall war. Das erste Argument im plot-Kommando gibt das x-Argument, das zweite das y-Argument des zu zeichnenden Punktes an, normalerweise stehen hier Vektoren, da viele Punkte auf einmal dargestellt werden. Das dritte Argument legt fest, wie diese Punkte darzustellen sind. Wir haben angegeben: r=rot und o=kleiner Kreis. Wir erhalten damit:
function Iteration(phi,Radius) x = Radius*cos(phi); y = Radius*sin(phi); plot(x,y,'ro'); f = [ x^2 - 4*y; 4*x - y^2]; J = [ 2*x, -4; +4, -2*y]; z = [x;y] - J\f; plot([z(1),x],(z(2),y],'r');dabei sind:
Radius = 10
|