[an error occurred while processing this directive]
Lösungen zu Übungsblatt 12Aufgabe 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:
Zu ermitteln sind:
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 SchlussphaseFür die Startphase verwenden wir das Modell:
Für die Schlußphase verwenden wir dasselbe dynamische Modell, tauschen jedoch das Abbruchkriterium aus:
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:
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:
Wir formulieren das Modell für die Startphase jetzt in der Form:
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: 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.
% 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.
Für die Schnittstelle zum M-File setzen wir:
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.
|