Test
Aus Wiki1
(Unterschied zwischen Versionen)
| (Der Versionsvergleich bezieht 35 dazwischenliegende Versionen mit ein.) | |||
| Zeile 1: | Zeile 1: | ||
| - | < | + | <jsxgraph box="jxgbox" width="500" height="500"> |
| + | var board = JXG.JSXGraph.initBoard('jxgbox', {boundingbox: [-5,5,5,-5], axis:true}); | ||
| - | <jsxgraph box=" | + | // Define the metal plate as a polygon |
| + | var polygon = board.create('polygon', [[-4,-4], [-4,4], [4,4], [4,-4]], {fillcolor:'#ddd', hasInnerPoints:true}); | ||
| + | |||
| + | // Define the initial temperature distribution as a function of x and y | ||
| + | function initialTemp(x,y) { | ||
| + | return 20 + 10*Math.sin(Math.PI*x/4)*Math.sin(Math.PI*y/4); | ||
| + | } | ||
| + | |||
| + | // Define the temperature function as a function of x and y and time | ||
| + | function temp(x,y,t) { | ||
| + | var k = 1; | ||
| + | var c = 1; | ||
| + | var rho = 1; | ||
| + | var alpha = k/(rho*c); | ||
| + | return initialTemp(x,y) + 10*Math.exp(-alpha*Math.PI*Math.PI*t/16)*Math.sin(Math.PI*x/4)*Math.sin(Math.PI*y/4); | ||
| + | } | ||
| + | |||
| + | // Create a grid of points to sample the temperature function | ||
| + | var points = []; | ||
| + | for (var i=-4; i<=4; i+=0.5) { | ||
| + | for (var j=-4; j<=4; j+=0.5) { | ||
| + | points.push([i,j]); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Plot the temperature distribution at time t=0 | ||
| + | var heatmap = board.create('polygon', [points, initialTemp], {colorscheme:'greyscale', minopacity:0.5}); | ||
| + | |||
| + | // Animate the temperature distribution over time | ||
| + | var time = 0; | ||
| + | var dt = 0.1; | ||
| + | var interval = setInterval(function() { | ||
| + | time += dt; | ||
| + | var values = []; | ||
| + | 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); | ||
| + | }, 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
