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))];
|