2

我正在尝试求解摆锤运动的微分方程,给定摆锤初始角度 (x)、重力加速度 (g)、线长 (l) 和时间步长 (h)。我用欧拉法试过这个,一切都很好。但现在我要使用 GSL 中实现的 Runge-Kutta 方法。我试图从 gsl 手册中学习实现它,但我遇到了一个问题。钟摆不想停下来。假设我从初始角度 1 rad 开始,它总是在 1 rad 处具有峰值倾斜,无论它已经做了多少次摆动。这是我用来将其提供给 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;
    }

参数gl正确传递给函数,我已经检查过了。

4

1 回答 1

6

正如 Barton Chittenden 在评论中指出的那样,钟摆应该在没有摩擦的情况下继续前进。这是意料之中的。

至于为什么在使用欧拉方法时它会变慢并停止,这涉及到一个微妙而有趣的主题。(理想的、无摩擦的)物理钟摆具有系统中能量守恒的特性。不同的集成方案在不同程度上保留了该属性。通过一些集成方案,系统中的能量会增长,钟摆会逐渐摆动得更高。对于其他人,能量会丢失,钟摆会停止。这两种情况发生的速度部分取决于方法的顺序;更准确的方法通常会更慢地失去能量。

您可以通过为不同的积分方案绘制系统中的总能量(势能 + 动能)来轻松观察到这一点。

最后,积分方法有一个完整的子领域,它保留了像这样的系统的某些守恒量,称为辛方法。

于 2012-04-25T20:45:45.963 回答