runge-kutta第四阶集成器的错误
Error with Runge-Kutta 4th order integrator
我一直在处理第四阶runge-kutta求解器,并且遇到了一些困难。我已经根据有关Gafferongames的文章编写了求解器,但是当我运行一个较小的示例时,即使是简单的重力力量,我所遇到的错误远比我通过简单的Euler集成所获得的错误要差得多。我已经将其整理成一个自我包含的示例(包括打印在内的代码约60行),但需要GLM运行。
它显示了我的整体问题。第55行打印出分析解决方案和RK4解决方案之间的差异。这应该相对较小,但是即使在采取10个奇数步骤之后,它也会爆炸。
#include <iostream>
#include <glm/glm.hpp>
struct State{
glm::vec3 position, velocity;
};
class Particle{
public:
glm::vec3 position, velocity, force;
float mass;
void solve(float dt);
glm::vec3 acceleration() const {return force/mass;}
State evalDerivative(float dt, const State& curr);
void analytic(float t, glm::vec3 a);
};
int main(int argc, char* argv[]){
Particle p;
p.position = glm::vec3(0.f);
p.mass = 1.0f;
for(int i = 1; i <= 10; i++) {
p.force = glm::vec3(0.f, -9.81f, 0.f);
p.solve(.016f);
p.analytic(i*.016f, glm::vec3(0.f, -9.81f, 0.f));
}
getchar();
return 0;
}
void Particle::solve(float dt){
State t;t.position = glm::vec3(0.f); t.velocity = glm::vec3(0.f);
State k1 = evalDerivative(0, t);
State k2 = evalDerivative(dt*.5f, k1);
State k3 = evalDerivative(dt*.5f, k2);
State k4 = evalDerivative(dt, k3);
position += (k1.position + 2.f*(k2.position + k3.position) + k4.position)/6.f;
velocity += (k1.velocity + 2.f*(k2.velocity + k3.velocity) + k4.velocity)/6.f;
force = glm::vec3(0.f);
}
State Particle::evalDerivative(float dt, const State& curr){
State s;
s.position = position + curr.position*dt;
s.velocity = velocity + curr.velocity*dt;
s.position = s.velocity;
s.velocity = acceleration();
return s;
}
void Particle::analytic(float t, glm::vec3 a){
glm::vec3 tPos = glm::vec3(0.f) + 0.5f*a*t*t;
glm::vec3 tVel = glm::vec3(0.f) + a*t;
glm::vec3 posdiff = tPos - position;
glm::vec3 veldiff = tVel - velocity;
std::cout << "POSITION: " << posdiff.x << ' ' << posdiff.y << ' ' << posdiff.z << std::endl;
std::cout << "VELOCITY: " << veldiff.x << ' ' << veldiff.y << ' ' << veldiff.z << std::endl << std::endl;
}
如果有人可以帮助我在这里,我正处于这个结束时。
好吧,我感到很愚蠢。我一直在研究这个小时,我错过了一个小步骤:
position += (k1.position + 2.f*(k2.position + k3.position) + k4.position)/6.f;
velocity += (k1.velocity + 2.f*(k2.velocity + k3.velocity) + k4.velocity)/6.f;
应该是
position += (k1.position + 2.f*(k2.position + k3.position) + k4.position)*dt/6.f;
velocity += (k1.velocity + 2.f*(k2.velocity + k3.velocity) + k4.velocity)*dt/6.f;
相关文章:
- 警告处理为错误这里有什么问题
- Python3.6 模板中的 CGAL C++ 集成错误
- 在UE4(虚幻引擎4)中集成LuaJit时LNK2005错误
- 使用 Pybind11 将函数集成到 Python C++错误,同时使用 PYBIND11_MODULE
- 编写蒙特卡洛集成程序,我不知道为什么我会收到某些错误
- 将 Boost Asio 与 ZeroMQ 集成,文件描述符错误?
- QML 引用错误 - <thing> 在 C++/QML 集成期间未定义
- 链接器为某些上下文中使用的集成静态常量成员提供错误"undefined symbol"
- 英特尔集成显卡错误识别 (DXGI)
- 类集成的奇怪错误
- Objective-C 集成 C 库并传递字符串值 - ARC 错误
- 集成库导致C++错误
- 在将GTest集成到我的项目时,GTest -printer .h出现错误
- MATLAB代码与C/ c++集成时的致命错误
- 在Swift项目中集成Box2d会出现cassert file not found错误
- 数组饼图的大小具有非集成类型'double'错误,
- MX在将matlab与VC++集成时产生双矩阵错误
- IOS集成Unity 4.6.3项目(64位&&IL2CPP)。出现以下这样的错误,如何解决?
- VTK集成到QT-VS2013:CMake错误-Qt5WebKitWidgets
- 尝试集成外部源代码时编译错误