四阶RK法求解含二次阻力的炮弹抛体运动C语言代码问题
四阶Runge-Kutta实现带二次阻力抛体运动的代码修复
嘿,我看你在做带二次阻力的抛体运动RK4仿真时踩了个典型的坑——二次阻力是和速度大小的平方成正比的,所以在RK4的每个中间阶段,你得用对应阶段的预估速度来计算阻力,而不是一直啃着当前时刻的v[i]不放!
先给你拆解下原代码的核心问题:
- 所有k2/k3/k4阶段的阻力计算都复用了初始的
v[i],但实际上每个中间步的速度已经有了增量,阻力必须跟着重新计算,不然完全不符合二次阻力的物理规律。 - 原代码里的
kk[i]如果是恒定的阻力系数,完全没必要用数组,用个常量就能简化代码(如果确实是随时间变化的,那再改回去就行)。 - 你没写完的
vx[i+1]更新公式,RK4的标准形式是加权平均,得补全。
下面是修正后的完整代码片段,每一步都加了注释说明:
// 假设:kk=恒定阻力系数,m=炮弹质量,g=重力加速度,delt=时间步长,n=总步数 for (int i = 1; i <= n; i++) { // 1. 计算当前时刻的速度大小 double v_current = sqrt(vx[i] * vx[i] + vy[i] * vy[i]); // k1, m1:当前时刻的加速度(对应RK4的第一个阶段) double k1 = (-kk * v_current * vx[i]) / m; double m1 = (-kk * v_current * vy[i] - m * g) / m; // 2. 计算k2阶段的预估速度和速度大小 double vx_k2 = vx[i] + k1 * delt / 2.0; double vy_k2 = vy[i] + m1 * delt / 2.0; double v_k2 = sqrt(vx_k2 * vx_k2 + vy_k2 * vy_k2); double k2 = (-kk * v_k2 * vx_k2) / m; double m2 = (-kk * v_k2 * vy_k2 - m * g) / m; // 3. 计算k3阶段的预估速度和速度大小 double vx_k3 = vx[i] + k2 * delt / 2.0; double vy_k3 = vy[i] + m2 * delt / 2.0; double v_k3 = sqrt(vx_k3 * vx_k3 + vy_k3 * vy_k3); double k3 = (-kk * v_k3 * vx_k3) / m; double m3 = (-kk * v_k3 * vy_k3 - m * g) / m; // 4. 计算k4阶段的预估速度和速度大小 double vx_k4 = vx[i] + k3 * delt; double vy_k4 = vy[i] + m3 * delt; double v_k4 = sqrt(vx_k4 * vx_k4 + vy_k4 * vy_k4); double k4 = (-kk * v_k4 * vx_k4) / m; double m4 = (-kk * v_k4 * vy_k4 - m * g) / m; // 用RK4标准公式更新速度 vx[i+1] = vx[i] + (delt / 6.0) * (k1 + 2*k2 + 2*k3 + k4); vy[i+1] = vy[i] + (delt / 6.0) * (m1 + 2*m2 + 2*m3 + m4); // 如果需要更新位置,也可以用同样的RK4逻辑 // x[i+1] = x[i] + (delt / 6.0) * (vx[i] + 2*vx_k2 + 2*vx_k3 + vx_k4); // y[i+1] = y[i] + (delt / 6.0) * (vy[i] + 2*vy_k2 + 2*vy_k3 + vy_k4); }
关键修正点说明:
- 每个中间步重新计算速度大小:k2/k3/k4阶段都先算出对应预估速度的分量,再求速度大小,用这个新的速度大小计算阻力,这才符合二次阻力
F = -kk*v*v_vec的物理模型。 - 简化阻力系数:如果你的阻力系数不是随时间变化的,用常量
kk比数组kk[i]更高效,要是确实需要随时间变化,把kk改回kk[i](注意k2阶段可能需要用i+0.5时刻的kk值,看你的需求)。 - 补全RK4更新公式:速度更新用了标准的1/6加权,确保四阶精度。
额外小提示:
- 初始条件要设置对:比如
vx[1]、vy[1]是初始速度分量,x[1]、y[1]是初始位置。 - 时间步长
delt别太大,否则RK4的精度会掉,甚至出现数值不稳定。 - 如果要加其他受力(比如风力),直接在加速度里叠加就行,逻辑和阻力一致。
内容的提问来源于stack exchange,提问作者Topcatmki
相关产品推荐
相关产品推荐

