1000)){ $dur=150; } # Parameter g (Erd)beschleunigung if(isset($_GET['g'])) { $gb=$_GET['g']; } else { $gb=9.80665; } # Pendellaenge li und Masse mi: if(isset($_GET['l1'])) { $l1=$_GET['l1']; } else { $l1=mt_rand(10,90)/100; } if ($l1 <= 0){ $l1=0.1; } elseif ($l1 >= 1){ $l1=0.9; } if(isset($_GET['m1'])) { $m1=$_GET['m1']; } else { $m1=mt_rand(10,90)/100; } if ($m1 <= 0){ $m1=0.1; } elseif ($m1 >= 1){ $m1=0.9; } # Pendellaenge 2: $l2=1-$l1; $pathfak=448; $pl1=$pathfak*$l1; $pl2=$pathfak*$l2; # Masse 2 $m2=1-$m1; $rmg=50*sqrt($m1); $wm1=max(2.0,0.3*$rmg); $rm1=max(1.0,$rmg-$wm1/2.0); $rmg=50*sqrt($m2); $wm2=max(2.0,0.3*$rmg); $rm2=max(1.0,$rmg-$wm2/2.0); if(isset($_GET['x1'])) { $x10=$_GET['x1']; } else { $x10=M_PI*mt_rand(-1000,1000)/1000; } if(isset($_GET['v1'])) { $v10=$_GET['v1']; } else { $v10=(2+mt_rand(-1000,1000)/1000)/$m1*$l1; } if(isset($_GET['x2'])) { $x20=$_GET['x2']; } else { $x20=M_PI*mt_rand(-1000,1000)/1000; } if(isset($_GET['v2'])) { $v20=$_GET['v2']; } else { $v20=mt_rand(-1000,1000)/200/$m2*$l2; } # Anzahl der Animationspunkte $anz=1500; # Funktion definieren function funcdgl ($t,$x1,$v1,$x2,$v2,&$k1,&$k2) { global $gb, $m1, $m2, $l1, $l2; $c=cos($x2-$x1); $s=sin($x2-$x1); $f1=$l1-$m2*$l1*$c*$c; $f2=$l2-$m2*$l2*$c*$c; $k1=($m2*$l2*$v2*$v2*$s +$m2*$l1*$v1*$v1*$s*$c -$gb*sin($x1)+$m2*$gb*$c*sin($x2))/$f1; $k2=(-$m2*$l2*$v2*$v2*$s*$c -$l1*$v1*$v1*$s +$gb*$c*sin($x1)-$gb*sin($x2))/$f2; return TRUE; } # Anfangswertproblem... # stroke-dasharray-Weglaenge $ssum = 0; # values und Pfad berechnen $x1=(($x10/M_PI*180)%360)/180*M_PI; $v1=$v10; $x2=(($x20/M_PI*180)%360)/180*M_PI; $v2=$v20; # einmal in kartesischen Koordinaten fuer den Pfad $px=round(cos($x1)*$pl1+cos($x2)*$pl2); $py=round(sin($x1)*$pl1+sin($x2)*$pl2); # und als Winkel fuer die Drehung $ppx=round($x1*180/M_PI); # weil der zweite mit dem ersten mitdreht, aber relativ zur # Vertikalen berechnet wird, den ersten abziehen. $ppy=round(($x2-$x1)*180/M_PI); $values1="$ppx"; $values2="$ppy"; $pfad="M$px,$py L"; $dash="0,1E6"; $dt=0.01; $vorherx=$px; $vorhery=$py; # Schleife fuer die weiteren numerischen Schritte for ($j = 1; $j <= $anz; $j++) { $t=$dt*$j; $kutta1=funcdgl($t,$x1,$v1,$x2,$v2,$k11,$k12); $kutta2=funcdgl($t+$dt/2.0, $x1+$v1*$dt/2.0+$k11/8.0*$dt*$dt,$v1+$k11*$dt/2.0, $x2+$v2*$dt/2.0+$k12/8.0*$dt*$dt,$v2+$k12*$dt/2.0, $k21,$k22); $kutta3=funcdgl($t+$dt/2.0, $x1+$v1*$dt/2.0+$k21/8.0*$dt*$dt,$v1+$k21*$dt/2.0, $x2+$v2*$dt/2.0+$k22/8.0*$dt*$dt,$v2+$k22*$dt/2.0, $k31,$k32); $kutta4=funcdgl($t+$dt, $x1+$v1*$dt+$k31/2.0*$dt*$dt,$v1+$k31*$dt, $x2+$v2*$dt+$k32/2.0*$dt*$dt,$v2+$k32*$dt, $k41,$k42); $x1=$x1 +$v1*$dt+$dt*$dt*($k11+$k21+$k31)/6.0; $x2=$x2 +$v2*$dt+$dt*$dt*($k12+$k22+$k32)/6.0; $v1=$v1+$dt*($k11+2.0*$k21+2.0*$k31+$k41)/6.0; $v2=$v2+$dt*($k12+2.0*$k22+2.0*$k32+$k42)/6.0; $px=round(cos($x1)*$pl1+cos($x2)*$pl2); $py=round(sin($x1)*$pl1+ sin($x2)*$pl2); $ppx=round($x1*180/M_PI); $ppy=round(($x2-$x1)*180/M_PI); $values1 .=";$ppx"; $values2 .=";$ppy"; $pfad .=" $px,$py"; $hx=$px-$vorherx; $hy=$py-$vorhery; $ssum = $ssum+sqrt($hx*$hx+$hy*$hy); $vorherx=$px; $vorhery=$py; $psum=round($ssum); $dash .=";$psum,1E6"; } # Bild in Speicher schreiben ob_start(); # xml-Zeile ausgeben echo ""; # und jetzt das Dokument ?> Doppelpendel Folgende Bewegungsgleichung wird numerisch gelöst: Hilfsgrößen: c=cos(x2-x1) s=sin(x2-x1) f1=l1 - m2 l1 c c f2=l2 - m2 l2 c c Differentialgleichung: dv1/dt=(m2 l2 v2 v2 s +m2 l1 v1 v1 s c -g sin(x1)+m2 g c sin(x2))/f1 dv2/dt=(-m2 l2 v2 v2 s c -l1 v1 v1 s +g c sin(x1)- g sin(x2))/f2 dx1/dt = v1 dx2/dt = v2 Die xi sind die Winkel relativ zur Vertikalen, die vi die Winkelgeschwindigkeiten. li sind die relativen Pendellaengen, mi ihre relativen Massen, g die (Erd)beschleunigung (um die 9.8 m/s^2); Die Summe der Pendellängen ist 1 und die der Massen ebenfalls. Die Dauer der Animation dur, l1, m1, Anfangswerte und g sind als GET-Parameter verfügbar. " xlink:title="fortsetzen"> " xlink:title="Neu starten und dann jeweils nach Ablauf der Animation automatisch neu starten (muß nicht bei allen Darstellungsprogrammen funktionieren)"> " xlink:title="Neue Animation starten, weiteren automatischen Neustart unterbinden"> O H 2006