Test
Aus Wiki1
(Unterschied zwischen Versionen)
(Der Versionsvergleich bezieht 12 dazwischenliegende Versionen mit ein.) | |||
Zeile 29: | Zeile 29: | ||
// Plot the temperature distribution at time t=0 | // Plot the temperature distribution at time t=0 | ||
- | var heatmap = board.create(' | + | var heatmap = board.create('polygon', [points, initialTemp], {colorscheme:'greyscale', minopacity:0.5}); |
// Animate the temperature distribution over time | // Animate the temperature distribution over time | ||
Zeile 38: | Zeile 38: | ||
var values = []; | var values = []; | ||
for (var i=0; i<points.length; i++) { | for (var i=0; i<points.length; i++) { | ||
- | + | values.push(temp(points[i][0], points[i][1], time)); | |
- | + | } | |
- | + | heatmap.updateData(values); | |
if (time >= 2) clearInterval(interval); | if (time >= 2) clearInterval(interval); | ||
}, 100); | }, 100); | ||
- | + | </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> |
Aktuelle Version vom 11:23, 5. Sep. 2025