You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用欧拉法循环绘制火箭轨迹的技术问题咨询

用欧拉法循环绘制火箭轨迹的实现方案

嘿,我来帮你梳理下用欧拉法绘制火箭轨迹的实现思路,先把你给出的内容整理清楚,再聊聊具体的循环实现方法:

一、基础参数定义

首先是你给出的初始参数,我整理成可运行的代码块(别忘了导入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,初始值设为v0x0
  • 遍历每个时间步,按欧拉法公式更新:
    1. 计算当前时刻的火箭质量:m_current = mo - q * current_t(current_t是当前时间)
    2. 计算当前加速度:推力加速度减去重力,也就是a = (u * q / m_current) - g
    3. 用欧拉法更新速度:new_v = 上一步速度 + a * 时间步长at
    4. 用欧拉法更新高度: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

火山引擎 最新活动