爆炸龙格库塔法
Exploding Runge Kutta Method
本文关键字:龙格库 更新时间:2023-10-16
我一直在尝试构建一个Runge Kutta四阶积分器来模拟简单的弹丸运动。我的代码如下
double rc4(double initState, double (*eqn)(double,double),double now,double dt)
{
double k1 = eqn(initState,now);
double k2 = eqn(initState + k1*dt/2.0,now + dt/2.0);
double k3 = eqn(initState + k2*dt/2.0,now + dt/2.0);
double k4 = eqn(initState + k3*dt, now + dt);
return initState + (dt/6.0) * (k1 + 2*k2 + 2*k3 + k4);
}
这在 while 循环中调用
while (time <= duration && yPos >=0)
{
xPos = updatePosX(xPos,vx,timeStep);
yPos = updatePosY(yPos,vy,timeStep);
vx = rc4(vx,updateVelX,time,timeStep);
vy = rc4(vy,updateVelY,time,timeStep);
cout << "x Pos: " << xPos <<"t y Pos: " << yPos << endl;
time+=timeStep;
myFile << xPos << " " << yPos << " " << vx << " " << vy << endl;
}
然而,与应该发生的事情相反,我的结果只是爆炸了。这是怎么回事?
您的 rk4 代码看起来正确。但仅适用于标量微分方程。
你最肯定的是维度大于 1 的耦合微分方程组。在这里,您必须以向量形式应用积分方法。也就是说,x,y,vx,vy
组合成一个 4 维(相位)状态向量,系统函数是向量值,k1,...k4
是向量等。
作为高级说明,time <= duration
对重复time+=timeStep;
中累积的舍入误差是明智的。最好使用time <= duration-timeStep/2
使循环末端的time
靠近duration
。
阅读上一个封闭问题的代码,我发现您对微分方程的想法有问题。在 RK4 实现中,不应将欧拉步长的结果用作加速度。无空气摩擦的弹道运动系统是
dotx = vx
doty = vy
dotvx = 0
dotvy = -g
您必须以矢量形式实现为类似
eqn(t, [x,y,vx,vy]) // where X = array of double of dimension 4
{ return [vx,vy,0,-g]; }
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- C/C++编译器通常会删除重复的库吗
- c++库的公共头文件中应该包含什么
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- cmake在我的项目中所需的所有静态库都不成功
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- node-gyp 在 macOS 上未正确链接库
- 导入库可以跨dll版本工作吗
- 为 n 维系统实现模块化龙格-库塔四阶方法
- n 维 4 阶龙格-库塔求解器大迭代中的误差
- 如何在具有Voro 库的容器中获取所有单元格的顶点
- 龙格-库塔算法C++
- 爆炸龙格库塔法
- 龙格库塔法圆周运动
- 使用龙格库塔的 2D 刚体物理
- 右龙格-库塔第四种方法
- 龙格-库塔四阶方法迭代时的累积误差
- 二阶龙格-库塔波动方程的积分