如何解决空气阻力在此模拟中导致速度急剧上升
我遇到的问题是,我试图在此基本物理模拟(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 。)
如果您不熟悉矢量代数,这看起来可能会令人困惑,但是如果不学习基础知识,就无法使空气阻力模拟程序正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。