实验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 碰撞后两小球黏在一起向右运动