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

\[f(x) = \cos\left(\frac{x}{2}\right)+1\]

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:

sphere rolling curve

2. Modellbildung#

Stellen Sie die Bewegungsgleichungen der Kugel auf. Formulieren Sie dazu die Zwangsbedingung (=Bahn) als Nullstellenproblem.

\[f(x,y)=0\]

Die Bewegungsgleichungen der Kugel ergeben sich aus der Kräftebilanz

\[\begin{split}m \left( \begin{array}{c} \ddot{x}\\ \ddot{y}\\ \end{array} \right) = \vec{F_\text{G}} + \vec{F_\text{R}}\end{split}\]

wobei sich die Zwangskraft \(F_\text{R}\) wie folgt berechnet:

\[\vec{F_\text{R}}=\lambda\cdot\text{grad}(f)\]
\[\begin{split}\text{grad}(f)=\left( \begin{array}{c} \ddot{\frac{\partial f}{\partial{x}}}\\ \ddot{\frac{\partial f}{\partial{y}}}\\ \end{array} \right)\end{split}\]

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:

\[q_1 = x, q_2 = \dot{x}, q_3 = y, q_4 = \dot{y}, q_5 = \lambda\]

\(\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.

\[\begin{split}M = \begin{pmatrix} 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 1\\ \end{pmatrix}\end{split}\]

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#

  1. Lassen Sie sich die Simulationsergebnisse als X-Y-Plot ausgeben.

  2. Plotten Sie die vorgegebene Bahnkurve sowie die Ergebnisse der DAE-Berechnung übereinander. Folgt die Kugel auch der Bahn oder gibt es Abweichungen?

  3. Definieren Sie folgende Events:
    Detektion von y == 1, y == 0 und Stopp der Simulation, wenn die Kugel das zweite Mal y == 0 (ca. bei x == 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

Lösung#

- Hinweis: Dieses Video ist von YouTube aus eingebunden und nicht Teil des frei lizenzierten Materials! -