官术网_书友最值得收藏!

實驗11 動能守恒不守恒你說了算

簡介

“碰撞”在物理學中表現為兩粒子或物體間極短的相互作用。碰撞后,參與物發生了速度、動量或能量的改變。碰撞按能量轉移的方式區分為彈性碰撞和非彈性碰撞。彈性碰撞是碰撞前后整個系統的動能不變的碰撞。彈性碰撞的必要條件是動能沒有轉成其他形式的能量(熱能、轉動能量),例如,原子的碰撞。非彈性碰撞是碰撞后整個系統的部分動能轉換成至少其中一個碰撞物的內能,使整個系統的動能無法守恒。在物理引擎當中,一般采用動量來解決碰撞反應。

完全彈性碰撞

完全彈性碰撞(Perfect Elastic Collision)在理想情況下的物理過程滿足動量守恒和能量守恒。

動量守恒:

動能定理:

碰撞后:

如果兩個碰撞小球的質量相等(即:m1=m2),聯立動量守恒和能量守恒方程時可解得:

即,兩個小球碰撞后交換速度。如果被碰撞的小球原來靜止,則碰撞后該小球具有了與碰撞小球一樣大小的速度,而碰撞小球則停止。代碼模擬:

        var canvas=document.getElementById("myCanvas");
        var cxt=canvas.getContext("2d");
        var r=15;
        var ball1={
                x: 20,
                y: 285,
                r: r,
                vx: 120,
                vy: 0
            };
        var ball2={    \注:假設兩個小球處于同一水平面上,即 y 相同,并且一個沿 x 正方向運動,一個沿x負方向運動。
        \
                x: 400,
                y: 285,
                r: r,
                vx: -30,
                vy: 0
            };
        var balls=[];
            balls.push(ball1);
            balls.push(ball2);
            cxt.fillStyle="#030303";
            cxt.fillRect(0, 0, canvas.width, canvas.height);
        function init() {
                cxt.fillStyle="#fff";
        for (i in balls) {
                  cxt.beginPath();
                  cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true);
                  cxt.closePath();
                  cxt.fill();
                }
            }
            init();
        var cyc=20;
        var moveAsync=eval(Jscex.compile("async", function () {
        while (true) {
                  cxt.fillStyle="rgba(0, 0, 0, .3)";
                  cxt.fillRect(0, 0, canvas.width, canvas.height);
                  cxt.fillStyle="#fff";
        if (Math.abs(ball1.x-ball2.x) <=2 * r) {    \注:碰撞檢測,當兩球的距離小球2*r時發生碰撞。\
        var temp=ball1.vx;
                      ball1.vx=ball2.vx;
                      ball2.vx=temp;
                  }
        for (i in balls) {
                      balls[i].x +=balls[i].vx * cyc / 1000;
                      cxt.beginPath();
                      cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true);
                      cxt.closePath();
                      cxt.fill();
                  }
                  $await(Jscex.Async.sleep(cyc));
                }
            }))

運行代碼,可以看到碰撞前兩小球的運動狀態如圖2-9所示。

圖2-9 碰撞前兩小球的運動狀態

碰撞后兩小球的運動狀態如圖2-10所示。

圖2-10 碰撞后兩小球的運動狀態

由圖2-9和圖2-10可知,兩個小球的速度進行了交換。

這里的代碼是在已知的結果下進行編寫的,在真實的物理引擎當中,需要給每個物體設定一個彈性系數和質量,然后根據彈性系統和質量計算碰撞之后的速度變化。

非彈性碰撞

碰撞過程中物體往往會發生形變,還會發熱、發聲。因此在一般情況下,碰撞過程中會有動能損失,即動能、機械能都不守恒,這類碰撞稱為非彈性碰撞(Inelastic Collision)。

代碼模擬:

        var moveAsync=eval(Jscex.compile("async", function () {
        while (true) {
                  cxt.fillStyle="rgba(0, 0, 0, .3)";
                  cxt.fillRect(0, 0, canvas.width, canvas.height);
                  cxt.fillStyle="#fff";
        if (Math.abs(ball1.x-ball2.x) <=2 * r) {
        var momentumSummation=ball1.vx+ball2.vx;    \注:動量總和,假設質量都為1。\
        var temp=ball2.vx;
                      ball2.vx=ball1.vx * 0.65;    \注:假設損失了65%速度。\
                      ball1.vx=momentumSummation-ball2.vx;    \注:\
                  }
        for (i in balls) {
                      balls[i].x +=balls[i].vx * cyc / 1000;
                      cxt.beginPath();
                      cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true);
                      cxt.closePath();
                      cxt.fill();
                  }
                  $await(Jscex.Async.sleep(cyc));
                }
            }))

運行代碼,可以看到碰撞前兩小球的運動狀態如圖2-11所示。

圖2-11 碰撞前兩小球的運動狀態

碰撞后兩小球的運動狀態如圖2-12所示。

圖2-12 碰撞后兩小球的運動狀態

完全非彈性碰撞

碰撞后兩物體結合在一起,動能損失最大,這種碰撞叫做完全非彈性碰撞。

由于碰撞后兩物體速度方向都一致,根據動量守恒定理,可以計算出:

v′=(v1+v2)/2

代碼模擬:

        var moveAsync=eval(Jscex.compile("async", function () {
        while (true) {
                  cxt.fillStyle="rgba(0, 0, 0, .3)";
                  cxt.fillRect(0, 0, canvas.width, canvas.height);
                  cxt.fillStyle="#fff";
        if (Math.abs(ball1.x-ball2.x) <=2 * r) {
                      v=(ball1.vx+ball2.vx) / 2;
                      ball1.vx=v;
                      ball2.vx=v;
                  }
        for (i in balls) {
                      balls[i].x +=balls[i].vx * cyc / 1000;
                      cxt.beginPath();
                      cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true);
                      cxt.closePath();
                      cxt.fill();
                  }
                  $await(Jscex.Async.sleep(cyc));
                }
            }))

運行代碼,可以看到碰撞前兩小球的運動狀態如圖2-13所示。

圖2-13 碰撞前兩小球的運動狀態

碰撞后兩小球黏在一起向右運動,如圖2-14所示。

圖2-14 碰撞后兩小球黏在一起向右運動

主站蜘蛛池模板: 无极县| 武定县| 沭阳县| 平定县| 维西| 通许县| 仙游县| 巴彦淖尔市| 邹平县| 涡阳县| 清河县| 马龙县| 洞口县| 青海省| 巨野县| 尼木县| 罗源县| 灌阳县| 凤阳县| 拉孜县| 钟祥市| 榆社县| 阜阳市| 麻栗坡县| 五原县| 云阳县| 资兴市| 安岳县| 嘉义县| 沂水县| 霍城县| 牡丹江市| 师宗县| 治多县| 凤山市| 子长县| 五家渠市| 武邑县| 鸡泽县| 融水| 聂拉木县|