% Aufgabe von Seite 501/502
function S501Ani (xAnf , tEnd)
if (nargin > 0) x0 = [xAnf ; 0] ; else x0 = [-4.493 ; 0] ; end if (nargin > 1) tspan = [0 , tEnd] ; else tspan = [0 ; 10] ; end
global cadmg bda gda
cadmg = 1 ; % ... = c * a / (m * g) bda = 4 ; % ... = b / a
gda = 9.81 ; % ... = g / a in 1/s²
options = odeset ('MaxStep' , 0.1) ; [t x] = ode45 (@RechteSeite , tspan , x0 , options) ;
xi = [1 0] * x' ; a = 1 ; Vektorlaenge = length(t) tt = tspan(1) ; maxi = max(xi) ; if (maxi < 0) maxi = a/4 ; end mini = min(xi) ; if (mini > 0) mini = -a/4 ; end clf ;
plot ([0 -a/2 -a/2 0],[0 a/3 -a/3 0] , 'r-') ; hold on plot ([a a],[-1.1*mini -1.1*maxi] , 'r-') ; hold on [xs ys nc] = SpringCoords ([0 0] , [a -xi(1)] , 4 , 2*bda) ;
[xs(nc+1:nc+8) ys(nc+1:nc+8) nc2] = MassCoords ([a -xi(1)] , a/2 , a) ; p = plot (xs , ys , 'EraseMode' , 'xor') ; h = findobj ; axis ([-a/4 1.3*a -1.2*maxi -1.2*mini]) ; axis equal ;
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
[xs ys nc] = SpringCoords ([0 0] , [a -xi(ii)] , 4 , 2*bda) ; [xs(nc+1:nc+8) ys(nc+1:nc+8) nc2] = MassCoords ([a -xi(ii)] , a/2 , a) ;
set(p , 'XData' , xs , 'YData' , ys) 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
% ====== Definition des Differenzialgleichungssystems: ================ function xpunkt = RechteSeite (t , x)
global cadmg bda gda xpunkt = [x(2); gda*(1-cadmg*(sqrt(1+x(1)^2)-bda)*x(1)/sqrt(1+x(1)^2))] ;
|