【发布时间】:2012-04-25 20:22:42
【问题描述】:
我正在尝试求解一个钟摆运动的微分方程,给定钟摆初始角度 (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))
这是代码 sn-p,如果这还不够,我可以发布整个程序(不会太长),但问题可能出在某处:
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 已正确传递给函数,我已经检查过了。
【问题讨论】:
-
在没有摩擦的情况下,这正是您应该期待的。
-
嗯,没有这样想过,但你可能是对的。为什么解决它的另一种方法(使用欧拉方法)导致它最终停止呢?也许我在某个地方犯了一个错误,但是是的,我认为你是完全正确的。似乎另一个程序被窃听了,而不是这个。我太傻了……如果我先做这个程序然后再做另一个,也许我不会受到钟摆最终停止的影响并在写到这里之前考虑一下。谢谢!
-
好问题。虽然前提不正确,但我从中学到了很多!谢谢!
标签: c gsl ode differential-equations