文号
942517
阅读
11804
回复
12
收藏
7
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
本文包含AI生成内容,并经过作者严格考据审查,作者对AI生成内容的品质和可靠性负责。
【原创】零维内弹道方程龙格-库塔法
2025/03/08
原创
IP:山西
摘要:零维内弹道模型是一种简化的内弹道分析方法,假设燃烧过程在空间上是均匀的,仅随时间变化,忽略气体流动的空间梯度。该模型通常用于描述封闭空间内(如枪膛或火箭发动机燃烧室)的燃烧过程,核心方程包括质量守恒、能量守恒和状态方程。龙格-库塔法是一种数值求解常微分方程(ODEs)的方法,其中四阶龙格-库塔法(RK4)因其高精度和稳定性而被广泛应用。RK4通过计算多个中间点的斜率,加权平均后得到更精确的解,适用于求解复杂的非线性微分方程,如零维内弹道方程。

今日我们便以固体火箭发动机内弹道学的零维内弹道方程龙格库塔法进行最简单的陈述。首先我先声明一下,本帖有编程计算和手动计算两种形式,让我们先了一解一下零维内弹道方程:零维内弹道方程描述燃烧室内压力随时间变化,忽略空间分布,仅考虑时间变量。常用于分析火箭发动机或火炮的内弹道过程,通过燃烧释放热量和气体膨胀计算压力变化。再介绍一下龙格库塔法:龙格法(龙格-库塔法)是一种数值求解微分方程的方法,通过多步加权计算提高精度,尤其四阶龙格-库塔法广泛用于科学计算和工程仿真。


第一步:零维内弹道方程的主要构成。
零维内弹道方程是描述燃烧室内压力随时间变化的数学模型,通常用于分析火箭发动机或火炮的内弹道过程。龙格-库塔法(Runge-Kutta method)是一种数值求解微分方程的方法,适用于求解零维内弹道方程。

upload_downloader_1741422440468_81680776.jpeg

  • P是燃烧室压力

  • t是时间

  • Y是比热比

  • V是燃烧室体积

如果将V设为常数,便可简化式子为:

upload_downloader_1741422440173_30331025.jpeg

第二步:龙格库塔法
零维内弹道方程是描述燃烧室内压力随时间变化的数学模型,通常用于分析火箭发动机或火炮的内弹道过程。龙格-库塔法(Runge-Kutta method)是一种数值求解微分方程的方法,适用于求解零维内弹道方程。龙格-库塔法是一种数值积分方法,用于求解微分方程。对于方程:

1741433056257.png

四阶龙格-库塔法的迭代公式为

upload_downloader_1741422441173_68310175.jpeg

其中:

upload_downloader_1741422443858_58230224.jpeg


第三步:手绘气压随时间变化曲线
1. 初始化参数
   - 初始压力
   - 时间步长
   - 总时间
   - 燃烧释放的热量速率
   - 燃烧室体积
   - 比热比
2、迭代计算
3、绘图

第四步:编程代码
如下:

import numpy as np
import matplotlib.pyplot as plt

# 定义零维内弹道方程
def dPdt(P, t, gamma, V, Q_dot):
    return (gamma - 1) / V * Q_dot

# 四阶龙格-库塔法
def runge_kutta_4th_order(P0, t, h, gamma, V, Q_dot):
    P = np.zeros(len(t))
    P[0] = P0
    for i in range(1, len(t)):
        k1 = h * dPdt(P[i-1], t[i-1], gamma, V, Q_dot)
        k2 = h * dPdt(P[i-1] + 0.5 * k1, t[i-1] + 0.5 * h, gamma, V, Q_dot)
        k3 = h * dPdt(P[i-1] + 0.5 * k2, t[i-1] + 0.5 * h, gamma, V, Q_dot)
        k4 = h * dPdt(P[i-1] + k3, t[i-1] + h, gamma, V, Q_dot)
        P = P[i-1] + (k1 + 2*k2 + 2*k3 + k4) / 6
    return P

# 参数设置
P0 = 0.0  # 初始压力 (Pa)
gamma = 1.4  # 比热比
V = 1.0  # 燃烧室体积 (m³)
Q_dot = 1000  # 燃烧释放热量速率 (J/s)
t_end = 10  # 总时间 (s)
h = 0.1  # 时间步长 (s)

# 时间数组
t = np.arange(0, t_end + h, h)

# 计算压力随时间变化
P = runge_kutta_4th_order(P0, t, h, gamma, V, Q_dot)

# 绘制气压随时间变化曲线
plt.plot(t, P, label="Pressure (Pa)")
plt.xlabel("Time (s)")
plt.ylabel("Pressure (Pa)")
plt.title("Pressure vs Time in Zero-Dimensional Interior Ballistics")
plt.grid()
plt.legend()
plt.show()



第五步:实例

1741483466020.png

upload_downloader_1741422442978_41096120.jpeg

第六步:全部计算

题目

1741581483248.png

IMG_20250309_215318.jpg

第七步:燃烧时间曲线结合计算法

手算方式

upload_downloader_1741422442783_32755835.jpeg

代码

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
d = 88e-3  # 装药内径 (m)
D = 106e-3  # 装药外径 (m)
L = 200e-3  # 装药长度 (m)
rho_p = 1775  # 装药密度 (kg/m^3)
V_c = 0.0079  # 燃烧室初始自由容积 (m^3)
r_gas = 1.2  # 燃气比热比
c_star = 1500  # 燃气特征速度 (m/s)
d_t = 17e-3  # 喷喉直径 (m)
p_c_t = 1.5e6  # 点火压强 (Pa)
p_a = 0.098e6  # 环境压强 (Pa)
T_c = 3260  # 燃烧温度 (K)
burn_rate_coeff = 8.3e-5  # 燃速系数
burn_rate_exp = 0.3  # 燃速指数

# 计算装药燃烧厚度
e = (D - d) / 2

# 燃速公式
def burn_rate(p_c):
    return burn_rate_coeff * p_c ** burn_rate_exp

# 燃烧时间计算
def burn_time(p_c):
    return e / burn_rate(p_c)

# 零维内弹道方程
def dpcdt(p_c, t):
    if t <= burn_time(p_c):  # 燃烧阶段
        m_dot_p = burn_rate(p_c) * rho_p * np.pi * (D**2 - d**2) / 4 * L
    else:  # 燃烧结束,停止产生燃气
        m_dot_p = 0
    A_t = np.pi * (d_t / 2)**2  # 喷喉面积
    m_dot_g = p_c * A_t / (c_star * np.sqrt(T_c))  # 喷喉质量流量
    return (r_gas - 1) / V_c * (m_dot_p - m_dot_g)

# 四阶龙格-库塔法
def runge_kutta_4th_order(p_c0, t, h):
    p_c = np.zeros(len(t))
    p_c[0] = p_c0
    for i in range(1, len(t)):
        k1 = h * dpcdt(p_c[i-1], t[i-1])
        k2 = h * dpcdt(p_c[i-1] + 0.5 * k1, t[i-1] + 0.5 * h)
        k3 = h * dpcdt(p_c[i-1] + 0.5 * k2, t[i-1] + 0.5 * h)
        k4 = h * dpcdt(p_c[i-1] + k3, t[i-1] + h)
        p_c = p_c[i-1] + (k1 + 2*k2 + 2*k3 + k4) / 6
    return p_c

# 时间数组
t_end = 20  # 总时间 (s),确保覆盖燃烧和排气阶段
h = 0.01  # 时间步长 (s)
t = np.arange(0, t_end, h)

# 计算燃烧室压强随时间变化
p_c = runge_kutta_4th_order(p_c_t, t, h)

# 绘制燃烧室压强随时间变化曲线
plt.plot(t, p_c / 1e6, label="Chamber Pressure (MPa)")
plt.xlabel("Time (s)")
plt.ylabel("Pressure (MPa)")
plt.title("Chamber Pressure vs Time")
plt.grid()

改进后的代码

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
d = 88e-3  # 装药内径 (m)
D = 106e-3  # 装药外径 (m)
L = 200e-3  # 装药长度 (m)
rho_p = 1775  # 装药密度 (kg/m^3)
V_c = 0.0079  # 燃烧室初始自由容积 (m^3)
r_gas = 1.2  # 燃气比热比
c_star = 1500  # 燃气特征速度 (m/s)
d_t = 17e-3  # 喷喉直径 (m)
p_c_t = 1.5e6  # 点火压强 (Pa)
p_a = 0.098e6  # 环境压强 (Pa)
T_c = 3260  # 燃烧温度 (K)
burn_rate_coeff = 8.3e-5  # 燃速系数
burn_rate_exp = 0.3  # 燃速指数

# 计算装药燃烧厚度
e = (D - d) / 2

# 燃速公式
def burn_rate(p_c):
    return burn_rate_coeff * p_c ** burn_rate_exp

# 燃烧时间计算
def burn_time(p_c):
    return e / burn_rate(p_c)

# 零维内弹道方程
def dpcdt(p_c, t):
    if t <= burn_time(p_c):  # 燃烧阶段
        m_dot_p = burn_rate(p_c) * rho_p * np.pi * (D**2 - d**2) / 4 * L
    else:  # 燃烧结束,停止产生燃气
        m_dot_p = 0
    A_t = np.pi * (d_t / 2)**2  # 喷喉面积
    m_dot_g = p_c * A_t / (c_star * np.sqrt(T_c))  # 喷喉质量流量
    return (r_gas - 1) / V_c * (m_dot_p - m_dot_g)

# 四阶龙格-库塔法
def runge_kutta_4th_order(p_c0, t, h):
    p_c = np.zeros(len(t))
    p_c[0] = p_c0
    for i in range(1, len(t)):
        k1 = h * dpcdt(p_c[i-1], t[i-1])
        k2 = h * dpcdt(p_c[i-1] + 0.5 * k1, t[i-1] + 0.5 * h)
        k3 = h * dpcdt(p_c[i-1] + 0.5 * k2, t[i-1] + 0.5 * h)
        k4 = h * dpcdt(p_c[i-1] + k3, t[i-1] + h)
        p_c[i] = p_c[i-1] + (k1 + 2*k2 + 2*k3 + k4) / 6
    return p_c

# 时间数组
t_end = 20  # 总时间 (s),确保覆盖燃烧和排气阶段
h = 0.01  # 时间步长 (s)
t = np.arange(0, t_end, h)

# 计算燃烧室压强随时间变化
p_c = runge_kutta_4th_order(p_c_t, t, h)

# 绘制燃烧室压强随时间变化曲线
plt.plot(t, p_c / 1e6, label="Chamber Pressure (MPa)")
plt.xlabel("Time (s)")
plt.ylabel("Pressure (MPa)")
plt.title("Chamber Pressure vs Time")
plt.grid()
plt.show()
    

曲线

IMG_0774.jpeg

见谅,望对大家有用

零维内弹道曲线生成器

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

使用方法



1. 打开链接

IMG_0823.jpeg

2. 点击运行

IMG_0820.jpeg

3. 输入参数

IMG_0821.jpeg

4. 生成曲线

IMG_0835.jpeg

5. 模拟完成


再推荐两个写代码的软件

写Jave的

attachment iconjdk1.664wei_downcc.zip14.17MBZIP5次下载

写c、 C++的

attachment iconvc6.0lsb_downcc.com-1.zip52.52MBZIP2次下载

注:全部本人原创

[ 修改于1年6个月前 - 2025/04/19 08:27:42 ]
12
9
HSH作者
1年8个月前IP:山西
942542
1楼

大家说说话吧1f602

引用
评论
1年7个月前IP:四川
942559
2楼
引用HSH发表于1楼的内容
大家说说话吧[表情]

第六步呢

引用
评论(4)
HSH作者
1年7个月前IP:山西
942580
3楼

等我以后有时间用代码把图发出来

引用
评论
HSH作者
1年7个月前IP:山西
942601
5楼

等我以后有时间用代码把图发出来

引用
评论
2
1年7个月前IP:山西
942825
6楼

厉害👍

引用
评论
HSH作者
1年7个月前修改于 1年7个月前IP:山西
942997
7楼

绘制完成

更改后的代码

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
d = 88e-3  # 装药内径 (m)
D = 106e-3  # 装药外径 (m)
L = 200e-3  # 装药长度 (m)
rho_p = 1775  # 装药密度 (kg/m^3)
V_c = 0.0079  # 燃烧室初始自由容积 (m^3)
r_gas = 1.2  # 燃气比热比
c_star = 1500  # 燃气特征速度 (m/s)
d_t = 17e-3  # 喷喉直径 (m)
p_c_t = 1.5e6  # 点火压强 (Pa)
p_a = 0.098e6  # 环境压强 (Pa)
T_c = 3260  # 燃烧温度 (K)
burn_rate_coeff = 8.3e-5  # 燃速系数
burn_rate_exp = 0.3  # 燃速指数

# 计算装药燃烧厚度
e = (D - d) / 2

# 燃速公式
def burn_rate(p_c):
    return burn_rate_coeff * p_c ** burn_rate_exp

# 燃烧时间计算
def burn_time(p_c):
    return e / burn_rate(p_c)

# 零维内弹道方程
def dpcdt(p_c, t):
    if t <= burn_time(p_c):  # 燃烧阶段
        m_dot_p = burn_rate(p_c) * rho_p * np.pi * (D**2 - d**2) / 4 * L
    else:  # 燃烧结束,停止产生燃气
        m_dot_p = 0
    A_t = np.pi * (d_t / 2)**2  # 喷喉面积
    m_dot_g = p_c * A_t / (c_star * np.sqrt(T_c))  # 喷喉质量流量
    return (r_gas - 1) / V_c * (m_dot_p - m_dot_g)

# 四阶龙格-库塔法
def runge_kutta_4th_order(p_c0, t, h):
    p_c = np.zeros(len(t))
    p_c[0] = p_c0
    for i in range(1, len(t)):
        k1 = h * dpcdt(p_c[i-1], t[i-1])
        k2 = h * dpcdt(p_c[i-1] + 0.5 * k1, t[i-1] + 0.5 * h)
        k3 = h * dpcdt(p_c[i-1] + 0.5 * k2, t[i-1] + 0.5 * h)
        k4 = h * dpcdt(p_c[i-1] + k3, t[i-1] + h)
        p_c[i] = p_c[i-1] + (k1 + 2*k2 + 2*k3 + k4) / 6
    return p_c

# 时间数组
t_end = 20  # 总时间 (s),确保覆盖燃烧和排气阶段
h = 0.01  # 时间步长 (s)
t = np.arange(0, t_end, h)

# 计算燃烧室压强随时间变化
p_c = runge_kutta_4th_order(p_c_t, t, h)

# 绘制燃烧室压强随时间变化曲线
plt.plot(t, p_c / 1e6, label="Chamber Pressure (MPa)")
plt.xlabel("Time (s)")
plt.ylabel("Pressure (MPa)")
plt.title("Chamber Pressure vs Time")
plt.grid()
plt.show()
    

效果图




浏览这段内容需要 1 学术分内容已隐藏
引用
评论
HSH作者
1年7个月前IP:山西
943008
8楼

大家不妨可以看出我手画图只画了上图上升的一段

引用
评论
HSH作者
1年6个月前IP:山西
943390
9楼

大家再看一遍文章,我加了些东西

引用
评论
1年6个月前IP:江苏
943405
10楼

看着没什么问题,但是感觉好奇怪

引用
评论
1年6个月前IP:江苏
943406
11楼

话说你发了什么?为什么需要一学术分1fae4

引用
评论(3)
HSH作者
1年4个月前IP:山西
944759
12楼
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的