我正在尝试用 C 中的谐波振荡器实现速度 Verlet,但我有一些错误:
- 能量不守恒
- 能量波动比我预期的要多得多
我相信这个错误与我的位置函数或定义有关,因为 PE 的爆炸速度比 KE 下降的速度快得多,但我无法确定错误。我想,也有可能 KE 的下降速度没有达到应有的速度。我想应该提到我是 C 编程的新手。
#include <stdio.H>
#include <math.H>
double position(double x0, double omega, double v0, double t)
{
return x0 * cos( omega * t) + (v0/omega) * sin( omega * t);
}
double velocity(double x0, double omega, double v0, double t)
{
return -x0 * omega * sin(omega * t) + v0 * cos( omega * t);
}
double acceleration(double x0, double omega, double v0, double t)
{
return -x0 * omega*omega * cos( omega * t) - v0 * omega * sin( omega * t);
}
int main()
{
double x0, v0, ao, x, xu, v, a, pe, ke, te, ft, t, m , dt, k, omega;
t=0;
ft = 10.;
dt = .01;
x0 = 0;
v0 = 1;
m = 1;
k= 1;
omega = .1;
for(t=0;t<=ft;t+=dt)
{
if(t==0)
{
x = position(x0, omega, v0,t);
v = velocity (x0, omega, v0, t);
a = acceleration(x0, omega, v0, t);
}
else
{
a = (-k * x)/m;
v = v + (0.5*a*dt);
x = x + (v * dt);
ao = acceleration(x, omega, v, t);
v = v + (0.5*ao*dt);
}
ke= 0.5 * m * v * v;
pe = 0.5 * k * x * x;
te = pe + ke;
//printf("position at time %f = %f\n",t,x);
//printf("velocity at time %f = %f\n",t,v);
//printf("acceleration at time %f = %f\n",t,a);*/
printf("energy at time %f = K: %f; V: %f; Total: %f\n\n",t,ke,pe,te);
}
return 0;
}