空气阻力在此模拟中导致速度急剧上升

问题描述

我遇到的问题是,我试图在此基本物理模拟(Java [处理])中向对象添加阻力,但是一旦添加了适当的公式,它就会使对象的速度急剧增加方向。当然,问题是由于某种原因导致的阻力计算得太高,但是我不确定为什么在使用现实世界方程式时会发生这种情况。

void setup(){size(1280,720);}

class Circle{
  float x,y,r,m,dx,dy,ax,ay,fx,fy;
  Circle(float xPos,float yPos,float Radius,float Mass){
    x = xPos;
    y = yPos;
    r = Radius;
    m = Mass;
  }
  
  void ADD_DRAG(){
    fx -= 0.5 * 1.225 * dx * dx * 0.5 * r * PI;
    fy -= 0.5 * 1.225 * dy * dy * 0.5 * r * PI;
  
  }
  
  void update(){
    ADD_DRAG();
    ax = fx / m;
    ay = fy / m;
    
    dx += ax / frameRate;
    dy += ay / frameRate;
    
    x += dx / frameRate;
    y += dy / frameRate;
  }
}

Circle[] SceneObjects = {new Circle(50,50,20,20000),new Circle(50,2,20)};



void draw(){
   background(51);
   
   for (Circle c : SceneObjects){
     c.update();
     circle(c.x * 3,c.y * 3,c.r * 3);  
   }  
}

void mouseClicked(){
  if(SceneObjects[1].fx != 2000)
    SceneObjects[1].fx = 2000;
  else
    SceneObjects[1].fx = 0;
}

这是代码,本质上是一个Circle类,用于存储对象属性,然后在每个绘制循环中更新作用力。 mouseClicked空隙仅用于通过向对象施加力来进行测试。感谢所有帮助,谢谢!

我正在使用的数学: 为ax = fx / m;重新排列了F = ma 加速度*时间= dx += ax / frameRate;的速度(frameRate为1 /时间) 距离=速度*时间= x += dx / frameRate;的时间(与上述相同) 对于阻力im,请使用此方程https://www.grc.nasa.gov/WWW/K-12/rocket/drageq.html,并添加常数,例如空气密度等,如图所示。

解决方法

这里有些错误。

您没有给我们编号(或minimal complete example),但矢量代数已关闭。

是的,加速度是 f = -k v 2 和| v | 2 = v x 2 + v y 2 ,但这并不意味着您可以将 f 分解为f x = kv x 2 和f y = kv y 2 。不仅您的幅度降低了,而且您的加速度现在(通常)与运动不对齐;弹丸的路径会趋向于在轴之间的对角线(例如x = y)弯曲

此外,您的代码总是在负x和负y方向上提供加速。如果您的弹丸刚好以这种方式开始,那么您的空气阻力版本会加快速度。

最后,您的时间间隔可能只是太大了。

有一个更好的方法。微分方程为 v '= -k v | v |,精确解为 v =( 1 / kt) z ,(选择适当的开始时间),其中 z 是单位方向矢量。 (我不知道如何在符号上加上插入符号。)这导致 v (t)=(1 / t) v (t = 1.0)

因此,您可以计算虚构时间t 0 并使用1 /(kt)计算每个新速度,也可以根据先前的速度计算新速度:v n +1 = v n /(kd v n + 1),其中d是时间间隔。 (然后当然必须将 v 正确分解为v x 和v y 。)

如果您不熟悉矢量代数,这看起来可能会令人困惑,但是如果不学习基础知识,就无法使空气阻力模拟程序正常工作。