c - C中弹丸(二次阻力)的四阶RK方法的递归值

标签 c

<分区>

我正在尝试使用四阶 RK 方法对炮弹的弹丸运动进行编码。我在以下代码中遇到问题。

for (i=1; i<=n; i=i+1)
{
    ax[i]= (-kk[i]*v[i]*vx[i])/m;
    ay[i]= ((-kk[i]*v[i]*vy[i])-(m*g))/m;
    k1= ax[i];
    m1= ay[i];
    k2= (-kk[i]*v[i]*(vx[i]+(k1*delt/2)))/m;
    m2=  (-kk[i]*v[i]*(vy[i]+(m1*delt/2)))/m;
    k3= (-kk[i]*v[i]*(vx[i]+(k2*delt/2)))/m;
    m3=  (-kk[i]*v[i]*(vy[i]+(m2*delt/2)))/m;
    k4= (-kk[i]*v[i]*(vx[i]+(k3*delt)))/m;
    m4=  (-kk[i]*v[i]*(vy[i]+(m3*delt)))/m;
    vx[i+1]= vx[i]+((1/6)*(k1+2*k2+2*k3+k4)*delt);
    vy[i+1]= vy[i]+((1/6)*(m1+2*m2+2*m3+m4)*delt);
    x[i+1]= vx[i+1]*delt;
    y[i+1]= vy[i+1]*delt;
    xx[i+1]= x[i+1] + xx[i];
    yy[i+1]= y[i+1] + yy[i];
    t[i+1]= t[i]+delt;
    v[i+1]= sqrt((vx[i+1]*vx[i+1])+(vy[i+1]*vy[i+1]));
    if ((yy[i+1]<0)&&(i!=1))
        //if (i==100)
    {
        nn=i;
        i=n;
    }
    printf ("%f\t%f\t%f\t%f\t%f\t%f\t\n", t[i], vx[i], vy[i], v[i], xx[i], yy[i]);

上面代码中的ax, ay, vx and vy分别是x和y方向的加速度和速度directions,delt代表时间步长。 xxyy 是对应时间步长的位置。 使用四阶 RK 方法后,我尝试在下一个时间步中找到速度,以获得循环中的相应值,直到弹丸撞击地面。但是对于每个相应的迭代和重复,我只得到与 vx[1]vy[1] 相同的值。我是 C 编程的初学者并且仍然在使用循环的初始阶段。

最佳答案

问题出在这里:

vx[i+1]= vx[i]+((1/6)*(k1+2*k2+2*k3+k4)*delt);
vy[i+1]= vy[i]+((1/6)*(m1+2*m2+2*m3+m4)*delt);

1/6 - 两个数字都是整数,因此这将导致 0 使您的陈述:

vx[i+1]= vx[i];
vy[i+1]= vy[i];

使它们成为 float 。由于您经常计算,因此将其设为常数。

const double one_sixth = 1.0 / 6.0;

然后

vx[i+1]= vx[i]+(one_sixth * (k1+2*k2+2*k3+k4)*delt);
vy[i+1]= vy[i]+(one_sixth * (m1+2*m2+2*m3+m4)*delt);

关于c - C中弹丸(二次阻力)的四阶RK方法的递归值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541702/

相关文章:

c - 识别gtk中滚动条的向上/向下移动

c - 将变量的内容分配给指针在 C 和 proC 中不起作用

c - 更优化的解决方案,查找字符串中子字符串的数量。使用C

c - uint32_t 和其他 stdint 类型的 atoi 或 strtoul 等价物是什么?

c - 如何在 SDL 2 中使用调色板

c - c语言Openflow数据包解析

c - 使用 float 和比较作为错误代码是否可移植?

c - 消息队列 : msgsnd failed : Invalid argument

c - Yocto/Poky : install and use shared library . 等在单独的层上

c - 我无法在这个简单的设备驱动程序模块中使用 echo 和 cat 。