|
|
| Zeile 44: |
Zeile 44: |
| | }, 100); | | }, 100); |
| | | | |
| | + | var r=3; |
| | + | var p0=[]; |
| | + | var p0[1]=board.create('point', [2.0, 2.0]), |
| | + | c1 = board.create('circle', [p1, r]); |
| | | | |
| - | </jsxgraph>
| |
| | | | |
| - |
| |
| - | <jsxgraph box="box" width="500" height="500">
| |
| - |
| |
| - | var brd = JXG.JSXGraph.initBoard('box', {boundingbox: [-3,3,3,-3], axis:true});
| |
| - |
| |
| - | // Parameter
| |
| - | let g = 9.81;
| |
| - | let l1 = 1.0, l2 = 1.0;
| |
| - | let m1 = 1.0, m2 = 1.0;
| |
| - |
| |
| - | // Anfangsbedingungen (Winkel in Radiant)
| |
| - | let theta1 = 0.1*Math.PI/2; // oberes Pendel
| |
| - | let theta2 = 0.1*Math.PI/4; // unteres Pendel
| |
| - | let omega1 = 0; // Winkelgeschwindigkeit 1
| |
| - | let omega2 = 0; // Winkelgeschwindigkeit 2
| |
| - |
| |
| - | // Hilfsfunktion: Bewegungsgleichungen (Runge-Kutta 4)
| |
| - | function dOmega(theta1, theta2, omega1, omega2) {
| |
| - | let delta = theta2 - theta1;
| |
| - |
| |
| - | let den1 = (m1+m2)*l1 - m2*l1*Math.cos(delta)*Math.cos(delta);
| |
| - | let den2 = (l2/l1)*den1;
| |
| - |
| |
| - | let a1 = (m2*l1*omega1*omega1*Math.sin(delta)*Math.cos(delta)
| |
| - | + m2*g*Math.sin(theta2)*Math.cos(delta)
| |
| - | + m2*l2*omega2*omega2*Math.sin(delta)
| |
| - | - (m1+m2)*g*Math.sin(theta1)) / den1;
| |
| - |
| |
| - | let a2 = (-m2*l2*omega2*omega2*Math.sin(delta)*Math.cos(delta)
| |
| - | + (m1+m2)*(g*Math.sin(theta1)*Math.cos(delta)
| |
| - | - l1*omega1*omega1*Math.sin(delta)
| |
| - | - g*Math.sin(theta2))) / den2;
| |
| - |
| |
| - | return [a1, a2];
| |
| - | }
| |
| - |
| |
| - | function rk4(dt) {
| |
| - | let [k1a1, k1a2] = dOmega(theta1, theta2, omega1, omega2);
| |
| - |
| |
| - | let t1 = theta1 + 0.5*dt*omega1;
| |
| - | let t2 = theta2 + 0.5*dt*omega2;
| |
| - | let w1 = omega1 + 0.5*dt*k1a1;
| |
| - | let w2 = omega2 + 0.5*dt*k1a2;
| |
| - | let [k2a1, k2a2] = dOmega(t1, t2, w1, w2);
| |
| - |
| |
| - | t1 = theta1 + 0.5*dt*omega1;
| |
| - | t2 = theta2 + 0.5*dt*omega2;
| |
| - | w1 = omega1 + 0.5*dt*k2a1;
| |
| - | w2 = omega2 + 0.5*dt*k2a2;
| |
| - | let [k3a1, k3a2] = dOmega(t1, t2, w1, w2);
| |
| - |
| |
| - | t1 = theta1 + dt*omega1;
| |
| - | t2 = theta2 + dt*omega2;
| |
| - | w1 = omega1 + dt*k3a1;
| |
| - | w2 = omega2 + dt*k3a2;
| |
| - | let [k4a1, k4a2] = dOmega(t1, t2, w1, w2);
| |
| - |
| |
| - | theta1 += dt*(omega1 + (w1 + 2*(omega1 + w1))/6); // kleine Vereinfachung
| |
| - | theta2 += dt*(omega2 + (w2 + 2*(omega2 + w2))/6);
| |
| - |
| |
| - | omega1 += dt*(k1a1 + 2*k2a1 + 2*k3a1 + k4a1)/6;
| |
| - | omega2 += dt*(k1a2 + 2*k2a2 + 2*k3a2 + k4a2)/6;
| |
| - | }
| |
| - |
| |
| - | // Punkte für das Pendel
| |
| - | let origin = brd.create('point', [0,0], {fixed:true, size:2, name:''});
| |
| - | let p1 = brd.create('point', [
| |
| - | () => l1*Math.sin(theta1),
| |
| - | () => -l1*Math.cos(theta1)
| |
| - | ], {size:2, name:'', color:'red'});
| |
| - | let p2 = brd.create('point', [
| |
| - | () => l1*Math.sin(theta1) + l2*Math.sin(theta2),
| |
| - | () => -l1*Math.cos(theta1) - l2*Math.cos(theta2)
| |
| - | ], {size:2, name:'', fillColor: 'rgba(255, 0, 0, 0.5)', trace:true});
| |
| - |
| |
| - | // Verbindungen
| |
| - | brd.create('line', [origin, p1], {straightFirst:false, straightLast:false});
| |
| - | brd.create('line', [p1, p2], {straightFirst:false, straightLast:false});
| |
| - |
| |
| - | // Animation
| |
| - | function step() {
| |
| - | rk4(0.01);
| |
| - | brd.update();
| |
| - | requestAnimationFrame(step);
| |
| - | }
| |
| - | step();
| |
| | </jsxgraph> | | </jsxgraph> |