Zur Startseite
Statik, Festigkeitslehre, Kinematik/Kinetik, 4. Auflage

Anhang B: Doppelpendel (Erweiterung des Beispiels 1 auf Seiten 634/635), Lösung mit MATLAB einschließlich Animation der Bewegung:

Zurück zur Aufgabenstellung

Die Lösung des nichtlinearen Diffenzialgleichungssystems, das die Bewegung beschreibt, mit MATLAB wird ausführlich hier beschrieben. Das dort angegebene MATLAB-Script wird hier nur so modifiziert, dass die graphische Ausgabe der Funktionen durch eine einfache Animation der Bewegung ersetzt wird (hellblaue Zeilen im nachfolgenden Listing):

function DoppelPendelAnimation (phi1Anf , phi2Anf)

if nargin == 2                         % Start mit vorgegebenen Anfangswerten?
   x0 = [phi1Anf ; phi2Anf ; 0 ; 0] ;  % Anfangswerte [phi1 ; phi2 ; omega1 ; omega2]
else
   x0 = [pi/2 ; 0 ; 0 ; 0] ;           % Default-Anfangswerte
end

% Parameter (global definiert, damit Wertaenderung nur an einer Stelle erforderlich):
global mdm J1 J2 s1 s2 gdl
mdm = 1 ; J1 = 1./12 ; J2 = 1./12 ; s1 = .5 ; s2 = .5 ; l1 = 1 ; l2 = 1 ; gdl = 9.81/l1 ;

tspan = [0 10] ;                      % Zeitintervall

% Integration des Anfangswertproblems:
options = odeset('Mass' , @Massenmatrix , 'MaxStep' , 0.01) ;
[t x]  = ode45 (@RechteSeite , tspan , x0 , options) ;

% Animation der Bewegung, zunaechst "Sortieren der Ergebnisse":
phi1i = [1 0 0 0] * x' ; % x' ist die transponierte Matrix der Ergebnisse,
phi2i = [0 1 0 0] * x' ; % phi1i und phi2i sind Vektoren

tt = tspan(1) ;
xx = [0  l1*sin(phi1i(1))  l1*sin(phi1i(1))+l2*sin(phi2i(1))] ;
yy = [0 -l1*cos(phi1i(1)) -l1*cos(phi1i(1))-l2*cos(phi2i(1))] ;
plot ([0 l1/8 -l1/8 0],[0 l1/6 l1/6 0] , 'r-') ;
hold on
p=plot (xx,yy,'o-','EraseMode','xor') ;
axis (1.1*[-(l1+l2) (l1+l2) -(l1+l2) (l1+l2)]) ;
zeit = title (sprintf('t = %8.2f s' , tt)) ;
set (gca , 'userdata' , zeit)

deltatt  = 1/25    ;    % 25 Bilder pro Sekunde
zeitlupe = 1       ;    % Verzögerungsfaktor
cstart   = cputime ;
Zeitschritte = length (t)

for ii=1:Zeitschritte    % Schleife über alle berechneten Zeitschritte
   if (t(ii) >= tt)      % Ausgabe jeweils nur nach deltatt
       xx = [0 l1*sin(phi1i(ii))  l1*sin(phi1i(ii))+l2*sin(phi2i(ii))] ;
       yy = [0 -l1*cos(phi1i(ii)) -l1*cos(phi1i(ii))-l2*cos(phi2i(ii))] ;
       set(p , 'XData' , xx , 'YData' , yy)
       while (cputime-cstart < tt*zeitlupe)  % Warteschleife
       end
       zeit = get (gca , 'userdata');
       set(zeit , 'string' , sprintf('t = %8.2f s' , tt))
       drawnow
       tt = tt + deltatt ;
   end
end

% ============================================================
% Funktion, die die "Massenmatrix" des Dgl.-Systems definiert:
function M = Massenmatrix (t , x)

% Parameter:
global mdm J1 J2 s1 s2 gdl

c = cos(x(1)-x(2));
M = [1 0 0 0 ; 0 1 0 0 ; 0 0 s1^2+J1+mdm mdm*s2*c ; 0 0 mdm*s2*c mdm*s2^2+J2] ;

% ============================================================
% Funktion, die die "rechte Seite" des Dgl.-Systems definiert:
function f = RechteSeite (t , x)

% Parameter:
global mdm J1 J2 s1 s2 gdl

s = sin(x(1)-x(2));
f = [x(3) ; x(4) ; -mdm*s2*x(4)^2*s-(s1+mdm)*gdl*sin(x(1)); mdm*s2*x(3)^2*s-mdm*s2*gdl*sin(x(2))];

Nach der numerischen Lösung des nichtlinearen Anfangswertproblems werden die beiden Funktionen φ1(t) und φ2(t) benutzt, um die Bewegung als Animation darzustellen (rechts ein Schnappschuss der Bewegung). Die Bewegung kann durch Vergrößerung des Parameters zeitlupe verlangsamt dargestellt werden. Die oben im Titelfeld angegebene Zeit ist immer (auch bei Zeitlupen-Darstellung) der zur gerade sichtbaren Stellung der beiden Pendel gehörende Wert.

Die oben gelistete M-Datei ist als DoppelpendelAnimation.m zum Download verfügbar.

Homepage

www.D@nkert.de

D

nkert.de