考虑到摆锤初始角度(x),重力加速度(g),线长度(l)和时间步长(h),我试图求解摆动运动的微分方程。我用Euler方法试过这个,一切都没问题。但现在我要使用在GSL中实现的Runge-Kutta方法。我试图从gsl手册中学习它,但我遇到了一个问题。钟摆不想停下来。假设我以初始角度1 rad开始它,无论它已经做了多少波动,它始终具有1弧度的峰值倾斜。这是我用来给GSL的等式和函数:
x''(t) + g/l*sin(x(t)) = 0
改造它:
x''(t) = -g/l*sin(x(t))
并分解:
y(t) = x'(t)
y'(t) = -g/l*sin(x(t))
这是代码片段,如果这还不够,我可以发布整个程序(它不会太长),但也许这就是问题所在:
int func (double t, const double x[], double dxdt[], void *params){
double l = *(double*) params;
double g = *(double*) (params+sizeof(double));
dxdt[0] = x[1];
dxdt[1] = -g/l*sin(x[0]);
return GSL_SUCCESS;
}
参数g
和l
正确传递给函数,我已经检查过了。
答案 0 :(得分:6)
正如Barton Chittenden在评论中指出的那样,钟摆应该在没有摩擦的情况下继续前进。这是预期的。
至于为什么当你使用欧拉方法时它减速和停止,这触及一个微妙而有趣的主题。 (理想的,无摩擦的)物理摆具有保持系统能量的特性。不同的集成方案在不同程度上保留了该属性。通过一些集成方案,系统中的能量将增长,并且钟摆将逐渐变高。与其他人一起,能量消失,钟摆停止。发生任何一种情况的速度部分取决于方法的顺序;更准确的方法通常会更慢地失去能量。
您可以通过绘制系统中的总能量(势能+动能)来轻松观察不同的集成方案。
最后,有一个完整的集成方法子领域,它保留了像这样的系统的某些守恒量,称为辛方法。