Test

Aus Wiki1

(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
 
(Der Versionsvergleich bezieht 38 dazwischenliegende Versionen mit ein.)
Zeile 1: Zeile 1:
-
<painting width=500 height=456>Name der Zeichnung</painting>
+
<jsxgraph box="jxgbox" width="500" height="500">
 +
        var board = JXG.JSXGraph.initBoard('jxgbox', {boundingbox: [-5,5,5,-5], axis:true});
-
<jsxgraph box="box" width="600" height="600">
+
        // Define the metal plate as a polygon
-
            var board = JXG.JSXGraph.initBoard('box', {boundingbox: [-10, 10, 10, -10], axis:true});
+
        var polygon = board.create('polygon', [[-4,-4], [-4,4], [4,4], [4,-4]], {fillcolor:'#ddd', hasInnerPoints:true});
-
            // Create the two tanks
+
        // Define the initial temperature distribution as a function of x and y
-
            var tank1 = board.create('circle', [[-5, 0], 1], {fillcolor: '#8bc34a', strokecolor: 'black', name: 'Tank 1'});
+
        function initialTemp(x,y) {
-
             var tank2 = board.create('circle', [[5, 0], 1], {fillcolor: '#8bc34a', strokecolor: 'black', name: 'Tank 2'});
+
             return 20 + 10*Math.sin(Math.PI*x/4)*Math.sin(Math.PI*y/4);
 +
        }
-
            // Create the connecting pipe
+
        // Define the temperature function as a function of x and y and time
-
             var pipe = board.create('line', [tank1, tank2], {strokecolor: 'black', strokewidth: 2});
+
        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 the heat exchanger
+
        // Create a grid of points to sample the temperature function
-
            var exchanger = board.create('polygon', [[-2, 2], [-2, -2], [2, -2], [2, 2]], {fillcolor: '#2196f3', strokecolor: 'black', name: 'Heat exchanger'});
+
        var points = [];
 +
        for (var i=-4; i<=4; i+=0.5) {
 +
            for (var j=-4; j<=4; j+=0.5) {
 +
                points.push([i,j]);
 +
            }
 +
        }
-
            // Create the heat flow arrow
+
        // Plot the temperature distribution at time t=0
-
            var arrow = board.create('arrow', [[-3, 3], [3, -3]], {strokecolor: 'red', strokewidth: 2, withLabel: true, name: 'Heat flow'});
+
        var heatmap = board.create('polygon', [points, initialTemp], {colorscheme:'greyscale', minopacity:0.5});
-
            // Create the temperature labels
+
        // Animate the temperature distribution over time
-
            var temp1 = board.create('text', [-5, -2, 'Temp 1'], {fontsize: 18});
+
        var time = 0;
-
             var temp2 = board.create('text', [5, -2, 'Temp 2'], {fontsize: 18});
+
        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);
-
            // Create the temperature sensors
 
-
            var sensor1 = board.create('point', [-5, 2], {visible: false});
 
-
            var sensor2 = board.create('point', [5, 2], {visible: false});
 
-
            // Create the temperature meters
+
</jsxgraph>
-
            var meter1 = board.create('meter', [[-7, 2], [-7, 0], [-5, 0], [-5, 2]], {value: 50, label: 'Temp 1'});
+
-
            var meter2 = board.create('meter', [[7, 2], [7, 0], [5, 0], [5, 2]], {value: 50, label: 'Temp 2'});
+
-
            // Create the temperature controller
+
 
-
            var controller = board.create('slider', [[0, -8], [8, -8], [0, 0, 100]], {name: 'Controller'});
+
<jsxgraph box="box" width="500" height="500">
-
            controller.on('drag', function() {
+
 
-
                // Update the temperature meters
+
        var brd = JXG.JSXGraph.initBoard('box', {boundingbox: [-3,3,3,-3], axis:true});
-
                var temp1 = meter1.Value() + (controller.Value() - meter2.Value()) / 10;
+
 
-
                var temp2 = meter2.Value() + (controller.Value() - meter1.Value()) / 10;
+
    // 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


Persönliche Werkzeuge