[an error occurred while processing this directive]   Suche  

Lösungen zu Übungsblatt 12

Aufgabe 1:

In Aufgabe 2 der 9.Übungen haben wir ein Problem betrachtet, das sich mit Integratoren mit variabler Schrittweite und exakter Nullstellenbestimmung nicht bearbeiten ließ,
   x''(t) + sign(x(t)+x'(t)) + x'(t) + 4*x(t) = 0;   x(0)=x'(0)=-1

Lösen Sie das Problem in zwei Phasen:

  • In der Startphase soll mit variabler Schrittweite und Nullstellenbestimmung für x(t)+x'(t) gearbeitet werden. Sorgen Sie dafür, daß diese Nullstellen möglichst genau bestimmt werden. Die Startphase soll beendet werden, sobald zum ersten mal eine Nullstelle der obigen Funktion aus dem Positiven erreicht wird.

  • In der anschließenden Schlussphase soll das System mit dem Dormand-Prince Verfahren ode5 mit der festen Schrittweite 0.001 integriert werden. Die Simulation soll abgebrochen werden, sobald der Wert von |x(t)| + |x'(t)| < 1.0e-3 wird.

Zu ermitteln sind:

  • die Abbruchzeitpunkte der beiden Phasen
  • Funktionsgraphen von x(t),x'(t), x(t)+x'(t) in einem Fenster
Hinweis:
In beiden Phasen wird dasselbe dynamische Modell, allerdings mit verschiedenen Abbruchkriterien verwendet. Außerdem werden in beiden Phasen natürlich andere Integratoren, Anfangswerte u.s.w. verwendet. Die unterschiedlichen Abbruchkriterien müssen im Modell berücksichtigt werden, weshalb es am einfachsten ist, mit unterschiedlichen Modellen für die beiden Phasen zu arbeiten.

Lösung mit getrennten Modellen für Start- und Schlussphase

Für die Startphase verwenden wir das Modell:

Modell für Aufgabe 1 Startphase

mit dem Subsystem:

Subsystem

Zu besetzen sind die folgenden Parameterwerte:
  • Subsystem/Integrator: Anfangswert = -1
  • Subsystem/Integrator1: Anfangswert = -1
  • Hit crossing Block: Offset = 0
  • Hit crossing Block: Direction = 'falling'
  • Hit crossing Block: show output port
  • Gain Block: Gain=4
Die Blöcke zum dynamischen System sind gelb hinterlegt, diejenigen zum Simulationsabbruch weiß. Sowohl der Sign-Block als auch der Hit crossing Block sorgen für eine genaue Bestimmung der Nullstellen von x(t)+x'(t).

Für die Schlußphase verwenden wir dasselbe dynamische Modell, tauschen jedoch das Abbruchkriterium aus:

Modell für Schlussphase

Die Parameter des Hit crossing Blockes haben jetzt die Werte:
  • Offset = 1.0e-3
  • Direction = 'falling'

Gestartet werden die beiden Modelle durch das folgende M-Skript, in dem auch die Simulationsparameter festgelegt werden.

   % M-File zur Loesung des Problems 3
   % Simulationsparameter setzen
    opt=simset('Solver','ode45','relTol',1.0e-8, ...
      'absTol',1.0e-16,'FinalStateName','speicher');
   % Simulationslauf: 1. Phase
    [t1,x1] = sim('A2a',[0 10],opt);
   % Letztes Element des t1-Vektors gibt Abbruchzeit der 1. Phase an
    zeit1 = t1(length(t1));
   % Simulationsparameter fuer den zweiten Lauf setzen
    opt=simset('Solver','ode5','FixedStep',0.001, ...
      'InitialState',speicher);
   % Simulationslauf: 2. Phase
    [t2,x2] = sim('A2b',[zeit1 10],opt);
   % Letztes Element des t2-Vektors gibt Abbruchzeit der 2. Phase an
    zeit2 = t2(length(t2));
   % Ausgabe der Abbruchzeiten
    format long e
    [zeit1 zeit2]
   % Ergebnis-Diagramm
    t = [t1;t2];
    x = [x1;x2];
    x(:,3) = x(:,1)+x(:,2);
    plot(t,x)
Als Abbruchzeiten erhalten wir:
1.760016569291984e+000 bzw. 7.430000000000000e+000
und die Funktionsgraphen entsprechen:

Funktionsgraphen

Aufgabe 2:

Formulieren Sie das Abbruchkriterium von Phase 1 aus Aufgabe 1 so um, dass der Abbruch erst erfolgt, wenn zum n. mal eine Nullstelle von x(t) + x'(t) in fallender Richtung passiert wird, geben Sie im M-Skript den Wert n=4 vor. Welche Abbruchzeiten ergeben sich?

Hinweis:

  • Vergewissern Sie sich im Zweifelsfalle mit get_parameter über die Schreibweise der Parameternamen.
  • Beachten Sie, dass mit set_parameter auch numerische Werte als Strings anzugeben sind.
  • Beachten Sie, dass Sie nur im aktuellen System Block-Parameter aus dem M-File ändern können.

Wir formulieren das Modell für die Startphase jetzt in der Form:

Modell zur Aufgabe 2

wobei das Subsystem Abbruch gegeben wird durch:

Subsystem zum Abbruch der Startphase

Das Modell für die Schlussphase modellieren wir analog mit einem Subsystem Abbruch, das aber nicht getriggert wird und stattdessen die Signale x und x' empfängt:

Subsystem zum Abbruch der Schlussphase

Im M-File der Offset-Wert des Hit crossing Blockes im Subsystem Abbruch der Startphase auf 4 gesetzt werden. Wir markieren dazu den betreffenden Block und erfahren mit Hilfe des Kommandos gcb im Matlab-Fenster, dass dieser Block den Namen A2start/Abbruch/Grenze hat. Mit Hilfe des Kommandos:
   get_param('A2start/Abbruch/Grenze','ObjectParameters')
erfahren wir, dass der gesuchte Parameter den Namen HitCrossingOffset hat. Das Kommando zur Besetzung des Parameterwertes lautet damit:
   set_param('A2start/Abbruch/Grenze','HitCrossingOffset','4');
Dieses Kommando setzt aber voraus, dass A2start bei seiner Ausführung gerade das aktuelle System ist. Dies können wir durch das open_system- Kommando garantieren. Gleichzeitig öffnet dieses Kommando das betreffende Modell auf dem Bildschirm.
Mit dem close_system-Kommando schließen wir das Modell wieder, da wir das Modell aber während der Abarbeitung des M-Skriptes verändert haben, müssen wir es zuvor mit dem Kommando save_system sichern.

Im folgenden M-File werden beide Modelle mit diesen Kommandos geöffnet und geschlossen. Bei hinreichend langsamem Rechner, zeigt das Modell auf dem Bildschirm daher immer an, mit welchem Modell gerade simuliert wird. Bei schnelleren Rechnern verschwinden die Modelle allerdings sehr schnell nach dem Erscheinen wieder vom Schirm. Würde man auf diese Darstellung verzichten, so wäre es sicher einfacher, den Wert 4 im Parameterfenster des Hit crossing Blockes anzugeben, statt diese 4 Kommandos im M-File zu benutzen.

Im folgenden M-File wird das Kommando gcs des ö:fteren benutzt, um den Namen des gerade aktuellen Systems zu liefern, man hätte natürlich auch dessen Namen direkt angeben können.

Als Ergebnis erhalten wir:
1.760426815764304e+000 7.445000000000000e+000

Das verwendete M-File lautet:

   % M-File zu Aufgabe 2
   % Phase 1
   open_system('A2start');
   set_param('A2start/Abbruch/Grenze','HitCrossingOffset','4');
   opt=simset('Solver','ode45','relTol',1.0e-8, ...
      'absTol',1.0e-16,'FinalStateName','speicher');
   [t1,x1] = sim(gcs,[0 10],opt);
   zeit1 = t1(length(t1));
   save_system(gcs);
   close_system(gcs);
   % Phase 2
   open_system('A2schluss');
   opt=simset('Solver','ode5','FixedStep',0.001, ...
     'InitialState',speicher);
   [t2,x2] = sim(gcs,[zeit1 10],opt);
   zeit2 = t2(length(t2));
   close_system(gcs);
   % Ergebnisausgabe
   format long e;
   [zeit1 zeit2]
   t = [t1; t2];
   x = [x1; x2];
   x(:,3) = x(:,1)+x(:,2);
   plot(t,x);

Aufgabe 3:

Modifizieren Sie das Modell aus Aufgabe 2 so, dass die Zahl n, die den Abbruchzeitpunkt für die erste Phase bestimmt, erst beim Start des Simulationslaufes für diese Phase vom Matlab-Arbeitsfenster eingelesen wird.
Beachten Sie, dass set_param nur auf das aktuelle Modell wirkt.

Wir wollen die beiden Modelle A2start und A2schluss aus Aufgabe 2 weiter verwenden. Offensichtlich müssen wir im M-File lediglich das set_param-Kommando abändern. Statt 'HitCrossingOffset','4' muss es jetzt heissen: 'InitFcn','n=input(''n?'');'. Im Modell A2start müssen wir dazu allerdings den Parameter 'Hit crossing offset' des Blockes 'A2start/Abbruch/Grenze' mit der Variablen n besetzen. Das stört die Ausführung des Skriptes zu Aufgabe 2 nicht, die Besetzung der IntFcn dagegen schon, da wir das System ja mit dieser Besetzung sichern. Um die Modelle auch weiterhin mit den Skripten zu Aufgabe 2 und 3 verwenden zu können, löschen wir die Besetzung der InitFcn vor dem Sichern wieder. Wir haben damit:

   % M-File zu Aufgabe 3
   % Phase 1
   open_system('A2start');
   set_param('A2start/Abbruch/Grenze','InitFcn','n=input(''n?'');');
   opt=simset('Solver','ode45','relTol',1.0e-8, ...
      'absTol',1.0e-16,'FinalStateName','speicher');
   [t1,x1] = sim(gcs,[0 10],opt);
   zeit1 = t1(length(t1));
   set_param('A2start/Abbruch/Grenze','InitFcn','');
   save_system(gcs);
   close_system(gcs);
   % Phase 2
   open_system('A2schluss');
   opt=simset('Solver','ode5','FixedStep',0.001, ...
     'InitialState',speicher);
   [t2,x2] = sim(gcs,[zeit1 10],opt);
   zeit2 = t2(length(t2));
   close_system(gcs);
   % Ergebnisausgabe
   format long e;
   [zeit1 zeit2]
   t = [t1; t2];
   x = [x1; x2];
   x(:,3) = x(:,1)+x(:,2);
   plot(t,x);

Aufgabe 4:

Ändern Sie das Modell aus Aufgabe 2 so ab, dass Start- und Schlussphase mit demselben Modell durchgeführt werden können.

Wir verwenden das Modell der Startphase von Aufgabe 2 und packen das Subsystem Abbruch aus der Schlussphase von Aufgabe 2 hinzu. Die beiden Subsysteme erhalten die Namen AbbruchStart und AbbruchSchluss. Die beiden Abbruch-Subsysteme dürfen jeweils nur in einer der Phasen aktiv sein, wir steuern sie deshalb durch Enable-Blöcke, die ihr Steuersignal von einem Constant-Block bekommen, dessen Wert wir aus dem M-Skript heraus in der Startphase mit +1, in der Schlussphase mit -1 besetzen.

Subsystem zum Abbruch der Schlussphase

Das entsprechende M-Skript lautet jetzt:
   % M-File zu Aufgabe 4
   % Phase 1
   open_system('A4');
   set_param('A4/AbbruchStart/Grenze','HitCrossingOffset','4');
   set_param('A4/Constant','Value','+1');
   opt=simset('Solver','ode45','relTol',1.0e-8, ...
     'absTol',1.0e-16,'FinalStateName','speicher');
   [t1,x1] = sim(gcs,[0 10],opt);
   zeit1 = t1(length(t1));
   % Phase 2
   set_param('A4/Constant','Value','-1');
   opt=simset('Solver','ode5','FixedStep',0.001, ...
     'InitialState',speicher);
   [t2,x2] = sim(gcs,[zeit1 10],opt);
   zeit2 = t2(length(t2));
   save_system(gcs);
   close_system(gcs);
   % Ergebnisausgabe
   format long e;
   [zeit1 zeit2]
   t = [t1; t2];
   x = [x1; x2];
   x(:,3) = x(:,1)+x(:,2);
   plot(t,x);

Aufgabe 5:

Formulieren Sie eine Benutzeroberfläche, die das folgende Fenster liefert und eine leicht abgewandelte Version des M-Skriptes aud Aufgabe 4 startet. Wandeln Sie das M-Skript aus Aufgabe 4 so ab, dass die Anzahl n der Nullstellen aus dem edit-Feld der Benutzeroberfläche übernommen wird.

Subsystem zum Abbruch der Schlussphase

Die Formulierung der vorgegebenen Benutzeroberfläche mit dem GUI Layout Tool sollte keine Probleme bereiten. Wir haben in diesem Falle die Hintergrundfarbe der Text-Felder der Hintergrundfarbe des Fensters angepasst.

Für die Schnittstelle zum M-File setzen wir:

  • den Wert von 'Tag' des edit-Feldes auf 'Eingabe'
  • den Wert von 'Callback' des pushbuttons auf 'MA5'
alle anderen Parameterwerte gehen aus der graphischen Darstellung der Benutzeroberfläche hervor.

Im M-Skript fragen wir mit:

   Wert = get(findobj('Tag','Eingabe'),'String');
den vom Benutzer eingegebenen Wert ab, findobj dient dabei dazu, das Handle des edit-Feldes zu bestimmen. Damit später die Ergebnisse nicht in die Benutzeroberfläche gezeichnet werden, schließen wir diese mit:
   delete(gcf);
Den erfragten Wert, eine Zeichenkette und keine Zahl, setzen wir mittels
   set_param('A4/AbbruchStart/Grenze','HitCrossingOffset',Wert);
als Offset des betreffenden Hit crossing Blockes ein.

Das gesamte M-File lautet dann:

   % M-File zu Aufgabe 5
   % Parameterwert uebernehmen
   Wert = get(findobj('Tag','Eingabe'),'String');
   delete(gcf);
   % Phase 1
   open_system('A4');
   set_param('A4/AbbruchStart/Grenze','HitCrossingOffset',Wert);
   set_param('A4/Constant','Value','+1');
   opt=simset('Solver','ode45','relTol',1.0e-8, ...
     'absTol',1.0e-16,'FinalStateName','speicher');
   [t1,x1] = sim(gcs,[0 10],opt);
   zeit1 = t1(length(t1));
   % Phase 2
   set_param('A4/Constant','Value','-1');
   opt=simset('Solver','ode5','FixedStep',0.001, ...
     'InitialState',speicher);
   [t2,x2] = sim(gcs,[zeit1 10],opt);
   zeit2 = t2(length(t2));
   save_system(gcs);
   close_system(gcs);
   % Ergebnisausgabe
   format long e;
   [zeit1 zeit2]
   t = [t1; t2];
   x = [x1; x2];
   x(:,3) = x(:,1)+x(:,2);
   plot(t,x);
Die Benutzer bekommen jetzt nur noch Graphik-Fenster zu sehen.