9. Differential-Algebraische Gleichungen (1)#
In dieser Übung wird das Rollen einer Kugel auf einer Bahn simuliert. Da die Bewegung der Kugel durch die Bahn eingeschränkt ist, handelt es sich um ein sog. DAE-System (Differential-Algebraic Equation).
Situation#
Eine Kugel rollt eine Bahn hinab. Diese Bahn ist beschrieben durch
Die Kugel kann als DAE-System modelliert und anschließend ihr Rollen auf der Bahn simuliert werden.
1. Kugelbahn#
Stellen Sie für die Bahn der Kugel eine eigene function
auf und plotten Sie diese.
% if your Octave kernel does not plot, write `graphics_toolkit("gnuplot")`
%your code here
Ihr Ergebnis sollte so aussehen:
2. Modellbildung#
Stellen Sie die Bewegungsgleichungen der Kugel auf. Formulieren Sie dazu die Zwangsbedingung (=Bahn) als Nullstellenproblem.
Die Bewegungsgleichungen der Kugel ergeben sich aus der Kräftebilanz
wobei sich die Zwangskraft \(F_\text{R}\) wie folgt berechnet:
Nun haben Sie zwei Differentialgleichungen für die \(x\)-\(y\)-Bewegungen. Die Zwangsbedingung \(f(x,y)\) muss nun noch auf Index-1 reduziert werden.
Dazu wird \(f\) zweimal nach der Zeit abgeleitet. Beachten Sie, dass sowohl \(x\) als auch \(y\) zeitabhängige Variablen sind.
Abschließend muss das entstandene System (=3 Gleichungen) auf Ordnung 1 reduziert werden (= 5 Gleichungen), bevor es in Matlab implementiert werden kann. Das zu implementierende System sollte dann folgende Form haben:
\(\dot{q_1}=q_2\)
\(\dot{q_2}=\dots\)
\(\dot{q_3}=q_3\)
\(\dot{q_4}=\dots\)
\(\dot{q_5}=\frac{d^2}{dt^2}f(x,y)\)
3. Implementierung#
Legen Sie zur Implementierung eine Programmstruktur ähnlich dem Lösen von ODEs an.
function main
q0 = [0;0.1;2;0;0];
tspan = [0,15];
[t,q] = ode15s(@dae,tspan,q0);
end
function dq = dae(t,q)
% Hier die Systemgleichungen einfügen
end
Zur Lösung benötigt der Solver Kenntnis über die Masse-Matrix des Systems. Diese definiert sich in diesem Fall als Einheitsmatrix, deren letzter Eintrag eine Null ist.
Definieren Sie daher vor dem Solver-Aufruf die Matrix \(M\) und übergeben Sie diese per folgender Codezeile:
options = odeset('Mass',M);
4. Simulation und Auswertung#
Lassen Sie sich die Simulationsergebnisse als X-Y-Plot ausgeben.
Plotten Sie die vorgegebene Bahnkurve sowie die Ergebnisse der DAE-Berechnung übereinander. Folgt die Kugel auch der Bahn oder gibt es Abweichungen?
Definieren Sie folgende Events:
Detektion vony == 1
,y == 0
und Stopp der Simulation, wenn die Kugel das zweite Maly == 0
(ca. beix == 9.4
) erreicht.
Zu welchem Zeitpunkt \(t\) werden diese Werte jeweils erreicht?
% your code here
5. Zusatz: Dämpfung und animierter Plot#
Ergänzen Sie zur Kräftebilanz eine verallgemeinerte Dämpfungskraft \(F_\text{d}=d\cdot\begin{pmatrix}\dot{x}\\\dot{y}\end{pmatrix}\), mit \(d=0.5\), sodass die Kugel nach einer gewissen Zeit zum Stillstand kommt.
Animieren Sie anschließend den Lauf der Kugel, indem Sie mittels for
-Schleife die Ergebnisse pro Zeitschritt nacheinander anzeigen lassen.
% if your Octave kernel does not plot, write `graphics_toolkit("gnuplot")`
for i = 1:length(t)
plot(q(i,1),q(i,3),'x')
grid on
axis([0,10,0,2])
pause(0.05)
drawnow
end