使用欧拉法循环绘制火箭轨迹的技术问题咨询
用欧拉法循环绘制火箭轨迹的实现方案
嘿,我来帮你梳理下用欧拉法绘制火箭轨迹的实现思路,先把你给出的内容整理清楚,再聊聊具体的循环实现方法:
一、基础参数定义
首先是你给出的初始参数,我整理成可运行的代码块(别忘了导入numpy哦):
import numpy as np mo = 1000 m = 900 q = 2.8 u = 3700 vo = 0 xo = 0.0001 g = 9.81 t = np.arange(0,int(1001)) x0 = 0.0001 v0 = 0 N = 1000 at = 1/1000
二、速度与高度的解析方程
你给出的速度和高度解析表达式可以写成这样的函数:
def v(t): return u*np.log(mo/(mo-q*t))-g*t def az(t): return xo + vo*t - 0.5*g*t**2 + u*t*np.log(mo) + (u/q)*((mo - q*t)*np.log(mo - q*t) + q*t - mo*np.log(mo))
另外你还写了部分高度表达式:
z = xo + vot - 0.5gt**2 + ut*np.log(mo) + (u/q)...
三、欧拉法循环实现轨迹绘制的核心思路
如果要用欧拉法迭代计算火箭的速度和高度,核心是按时间步逐步更新状态,具体步骤如下:
- 初始化两个列表,分别存储每个时间步的速度
v_list和高度z_list,初始值设为v0和x0 - 遍历每个时间步,按欧拉法公式更新:
- 计算当前时刻的火箭质量:
m_current = mo - q * current_t(current_t是当前时间) - 计算当前加速度:推力加速度减去重力,也就是
a = (u * q / m_current) - g - 用欧拉法更新速度:
new_v = 上一步速度 + a * 时间步长at - 用欧拉法更新高度:
new_z = 上一步高度 + 上一步速度 * 时间步长at
- 计算当前时刻的火箭质量:
- 循环结束后,用matplotlib绘制高度随时间变化的轨迹就行
给你写个完整的循环实现示例:
import matplotlib.pyplot as plt # 初始化存储数组 v_list = [v0] z_list = [x0] for i in range(N): current_t = i * at # 计算当前质量,避免燃料耗尽后质量为负,提前终止循环 m_current = mo - q * current_t if m_current <= 0: # 燃料耗尽后,加速度变为-g a = -g else: a = (u * q / m_current) - g # 欧拉法更新速度和高度 new_v = v_list[-1] + a * at new_z = z_list[-1] + v_list[-1] * at # 添加到列表中 v_list.append(new_v) z_list.append(new_z) # 绘制轨迹图 plt.figure(figsize=(10,6)) plt.plot(np.arange(0, len(z_list)*at, at), z_list, label='欧拉法计算轨迹') plt.xlabel('时间 (s)') plt.ylabel('高度 (m)') plt.title('火箭飞行轨迹(欧拉法迭代)') plt.legend() plt.grid(True) plt.show()
几个需要注意的细节
- 一定要处理燃料耗尽的情况:当
mo - q*t <= 0时,火箭不再有推力,加速度就只剩重力加速度-g了,不然会出现除以0或者负质量的错误 - 欧拉法的时间步长
at越小,计算结果越接近解析解,但对应的计算量也会增加,你设置的at=1/1000这个步长是比较合理的 - 如果要对比解析解和欧拉法的结果,可以把解析方程计算的高度也画在同一张图里,这样能直观看到误差
内容的提问来源于stack exchange,提问作者fghjk




