我正在尝试求解摆锤运动的微分方程,给定摆锤初始角度 (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;
}
参数g
和l
正确传递给函数,我已经检查过了。