【问题标题】:Air Resistance In this simulation causes the velocity to rise drastically空气阻力在这个模拟中导致速度急剧上升
【发布时间】:2020-10-07 09:14:58
【问题描述】:

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

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,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 void 仅用于通过向对象添加力进行测试。感谢所有和任何帮助,谢谢!

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

【问题讨论】:

  • 我不是专家,但你应该整合渐变吗?
  • 我认为因为 dx 和 dy 是以 m/s 为单位除以帧速率的速度会给出米,因为帧速率是 1/s。积分不只是做同一件事的不同方式吗?
  • 我不这么认为。如果你想要净 x 和 y,你绝对可以整合 x (+= ),但整合 dx 和 dy 至少对我来说没有意义。您能否编辑帖子并附上您正在使用的数学的链接?
  • 我已经添加了数学。也只是以防万一 fx = 力 ax = 加速度 dx = 速度 x = 位置,我觉得我没有解释过,谢谢!
  • 这个网站也展示了速度的积分与加速度的关系physics.info/kinematics-calculus

标签: java processing simulation physics


【解决方案1】:

这里有几个问题。

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

是的,加速度是f = -kv2,而|v| 2 = vx2 + vy2,但这并不意味着你可以将 f 分解为 fx=kvx2 和 fy=kv y2。不仅您的幅度偏离了,而且您的加速度现在(通常)与运动不一致;您的射弹路径将倾向于弯曲朝向轴之间的对角线(例如 x=y)。

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

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

有更好的方法。微分方程为v' = -k v|v|,精确解为v = ( 1/kt) z, (with appropriate choice of the starting time) where z is the unit direction vector. (我不知道如何将插入符号放在字母上。)这导致 v(t) = (1/t)v(t=1.0)

因此,您可以计算出一个虚构的时间 t0 并使用 1/(kt) 计算每个新速度,或者您可以根据之前的速度计算新速度:vn +1 =vn/(kd vn + 1),其中d是时间间隔。 (当然你必须将 v 分解为 vx 和 vy 正确。)

如果您不熟悉矢量代数,这可能会让人感到困惑,但如果不学习基础知识,您将无法让空气阻力 sim 工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多