在 C 中为谐振子实现速度 verlet 给出了能量守恒的误差

计算科学 计算物理学 C
2021-11-28 00:08:51

我正在尝试用 C 中的谐波振荡器实现速度 Verlet,但我有一些错误:

  1. 能量不守恒
  2. 能量波动比我预期的要多得多

我相信这个错误与我的位置函数或定义有关,因为 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;
}
1个回答

ao您在声明中的第二次加速else没有意义。因为它假设计算出的位置和速度是时的初始条件,然后您在当前时间对其进行评估。t=0

如果将 for 的表达式更改为与 forao相同的表达式a,但使用更新后的位置,那么您应该会得到预期的结果。