Python脚本计算内弹道(似乎有问题)
ZiRui2024/06/06喷气推进 IP:广东
from tkinter import Tk, Label, Entry, Button, StringVar
from tkinter.messagebox import showerror
from tkinter.filedialog import askdirectory
from math import sqrt

root = Tk()
root.title("推力室内弹道")


def calculate():
    try:
        gamma = float(gamma_entry.get())
        mass_flow = float(mass_flow_entry.get())
        pressure = float(pressure_entry.get())
        temperature = float(temperature_entry.get())
        gas_constant = float(gas_constant_entry.get())
        pressure_export = float(pressure_export_entry.get())
        characteristic_length = float(characteristic_length_entry.get())
        diameter_convergence_ratio_length = float(diameter_convergence_ratio_length_entry.get())
        convergence_half_angle = float(convergence_half_angle_entry.get())

        G = sqrt(gamma) * (2 / (gamma + 1)) ** ((gamma + 1) / (2 * (gamma - 1)))
        throat_area = mass_flow / (G * (pressure / sqrt(gas_constant * temperature)))
        compute_throat_diameter = sqrt(throat_area / 3.14159) * 2

        expansion_area_ratio = ((2 / (gamma + 1)) ** (1 / (gamma - 1)) * (
                (pressure / pressure_export) ** (1 / gamma))) / sqrt(
            ((gamma + 1) / (gamma - 1)) * (1 - ((pressure_export / pressure) ** ((gamma - 1) / gamma))))
        compute_export_diameter = sqrt(throat_area * expansion_area_ratio / 3.14159) * 2

        chamber_volume = throat_area * characteristic_length
        compute_chamber_radius = round(compute_throat_diameter * diameter_convergence_ratio_length + 0.4, 0) / 2
        compute_convergence_length = (90 / convergence_half_angle - 1) * \
                                     (compute_chamber_radius - (compute_throat_diameter / 2))
        chamber_volume -= float(compute_convergence_length) * 3.14159 * float(compute_chamber_radius ** 2 +
                                                                  (compute_throat_diameter / 2) ** 2 +
                                                                  compute_throat_diameter / 2 * compute_chamber_radius) / 3000
        compute_cylinder_length = chamber_volume * 1000 / (compute_chamber_radius ** 2 * 3.14159)

        chamber_diameter.set(f"{compute_chamber_radius * 2}")
        cylinder_length.set(f"{round(compute_cylinder_length + 0.4, 0)}")
        convergence_length.set(f"{round(compute_convergence_length + 0.4, 0)}")
        throat_diameter.set(f"{round(compute_throat_diameter, 3)}")
        expansion_diameter.set(f"{round(compute_export_diameter, 3)}")
        expansion_ratio.set(f"{round(expansion_area_ratio, 3)}")
    except Exception as e:
        showerror("错误", f"计算过程中发生错误:\n{str(e)}")
        print(e)


mass_flow_label = Label(root, text="质量流量(Kg/s):")
mass_flow_label.grid(row=0, column=0, padx=5, pady=5)
mass_flow_entry = Entry(root)
mass_flow_entry.grid(row=0, column=1, padx=5, pady=5)

gamma_label = Label(root, text="比热比(γ):")
gamma_label.grid(row=1, column=0, padx=5, pady=5)
gamma_entry = Entry(root)
gamma_entry.grid(row=1, column=1, padx=5, pady=5)

pressure_label = Label(root, text="压力(MPa):")
pressure_label.grid(row=2, column=0, padx=5, pady=5)
pressure_entry = Entry(root)
pressure_entry.grid(row=2, column=1, padx=5, pady=5)

temperature_label = Label(root, text="温度(K):")
temperature_label.grid(row=3, column=0, padx=5, pady=5)
temperature_entry = Entry(root)
temperature_entry.grid(row=3, column=1, padx=5, pady=5)

gas_constant_label = Label(root, text="气体常数(J/(Kg·K)):")
gas_constant_label.grid(row=4, column=0, padx=5, pady=5)
gas_constant_entry = Entry(root)
gas_constant_entry.grid(row=4, column=1, padx=5, pady=5)

pressure_export_label = Label(root, text="出口压力(MPa):")
pressure_export_label.grid(row=5, column=0, padx=5, pady=5)
pressure_export_entry = Entry(root)
pressure_export_entry.grid(row=5, column=1, padx=5, pady=5)

characteristic_length_label = Label(root, text="特征长度(m):")
characteristic_length_label.grid(row=6, column=0, padx=5, pady=5)
characteristic_length_entry = Entry(root)
characteristic_length_entry.grid(row=6, column=1, padx=5, pady=5)

diameter_convergence_ratio_length_label = Label(root, text="直径收敛比(Dc/Dt):")
diameter_convergence_ratio_length_label.grid(row=7, column=0, padx=5, pady=5)
diameter_convergence_ratio_length_entry = Entry(root)
diameter_convergence_ratio_length_entry.grid(row=7, column=1, padx=5, pady=5)

convergence_half_angle_label = Label(root, text="敛段半角(°):")
convergence_half_angle_label.grid(row=8, column=0, padx=5, pady=5)
convergence_half_angle_entry = Entry(root)
convergence_half_angle_entry.grid(row=8, column=1, padx=5, pady=5)


def save():
    with open(f"{askdirectory()}/液机推力室内弹道计算.txt", 'w+', encoding="utf-8") as file:
        file.write(f"推力室形状:\n")
        file.write(f"燃烧室直径Dc(mm):{chamber_diameter.get()}\n")
        file.write(f"圆筒段长度Lcyl(mm):{cylinder_length.get()}\n")
        file.write(f"喷喉直径Dt(mm):{throat_diameter.get()}\n")
        file.write(f"收敛段长度(mm):{convergence_length.get()}\n")
        file.write(f"出口直径De(mm):{expansion_diameter.get()}\n")
        file.write(f"膨胀比Ae/At:{expansion_ratio.get()}\n")


calculate_button = Button(root, text="计算", command=calculate)
calculate_button.grid(row=9, column=0, columnspan=2, padx=5, pady=5, sticky="ew")

save_button = Button(root, text="保存", command=save)
save_button.grid(row=10, column=0, columnspan=2, padx=5, pady=5, sticky="ew")

chamber_diameter = StringVar()
chamber_diameter_label = Label(root, text='燃烧室直径Dc(mm):')
chamber_diameter_label.grid(row=11, column=0)
chamber_diameter_value = Label(root, textvariable=chamber_diameter)
chamber_diameter_value.grid(row=11, column=1)

cylinder_length = StringVar()
cylinder_length_label = Label(root, text='圆筒段长度Lcyl(mm):')
cylinder_length_label.grid(row=12, column=0)
cylinder_length_value = Label(root, textvariable=cylinder_length)
cylinder_length_value.grid(row=12, column=1)

throat_diameter = StringVar()
throat_diameter_label = Label(root, text='喷喉直径Dt(mm):')
throat_diameter_label.grid(row=13, column=0)
throat_diameter_value = Label(root, textvariable=throat_diameter)
throat_diameter_value.grid(row=13, column=1)

convergence_length = StringVar()
convergence_length_label = Label(root, text='收敛段长度(mm):')
convergence_length_label.grid(row=14, column=0)
convergence_length_value = Label(root, textvariable=convergence_length)
convergence_length_value.grid(row=14, column=1)

expansion_diameter = StringVar()
expansion_diameter_label = Label(root, text='出口直径De(mm):')
expansion_diameter_label.grid(row=15, column=0)
expansion_diameter_value = Label(root, textvariable=expansion_diameter)
expansion_diameter_value.grid(row=15, column=1)

expansion_ratio = StringVar()
expansion_ratio_label = Label(root, text='膨胀比Ae/At:')
expansion_ratio_label.grid(row=16, column=0)
expansion_ratio_value = Label(root, textvariable=expansion_ratio)
expansion_ratio_value.grid(row=16, column=1)

root.mainloop()

算出来的数据可能有问题,给大家提供一个可能正确的方法

来自:航空航天 / 喷气推进
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
ZiRui 作者
3个月18天前 IP:广东
934967

收敛段长度计算有误,已改正并改为PyQt5:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, \
    QWidget, QFileDialog, QMessageBox
from PyQt5.QtCore import Qt
from math import sqrt, tan, radians


class RocketChamberDesign(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("推力室内弹道")
        self.setGeometry(100, 100, 600, 400)

        self.setStyleSheet("""
            QMainWindow {
                background-color: #f0f0f0;
            }

            QLabel {
                font-size: 14px;
                color: #333333;
            }

            QLineEdit {
                font-size: 14px;
                border: 1px solid #cccccc;
                padding: 5px;
                background-color: white;
                border-radius: 5px;
            }

            QPushButton {
                font-size: 16px;
                padding: 10px 20px;
                border: none;
                background-color: #007acc;
                color: white;
                border-radius: 5px;
            }

            QPushButton:hover {
                background-color: #005fa3;
            }
        """)

        self.initUI()

    def initUI(self):
        central_widget = QWidget(self)
        main_layout = QVBoxLayout()
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)

        # Labels and LineEdits
        self.create_input("质量流量(Kg/s):", main_layout)
        self.create_input("气体比热比(γ):", main_layout)
        self.create_input("燃室压力(MPa):", main_layout)
        self.create_input("燃室温度(K):", main_layout)
        self.create_input("气体常数(J/(Kg·K)):", main_layout)
        self.create_input("出口压力(MPa):", main_layout)
        self.create_input("特征长度(m):", main_layout)
        self.create_input("径收敛比(Dc/Dt):", main_layout)
        self.create_input("敛段半角(°):", main_layout)

        # Button layout
        button_layout = QHBoxLayout()
        calculate_button = QPushButton("计算", self)
        calculate_button.clicked.connect(self.calculate)
        button_layout.addWidget(calculate_button, alignment=Qt.AlignHCenter)

        save_button = QPushButton("保存", self)
        save_button.clicked.connect(self.save)
        button_layout.addWidget(save_button, alignment=Qt.AlignHCenter)

        # Add the button layout to the main layout
        main_layout.addLayout(button_layout)

        # Output labels and line edits
        output_layout = QVBoxLayout()
        self.create_output("燃烧室直径Dc(mm):", output_layout)
        self.create_output("圆筒段长度Lcyl(mm):", output_layout)
        self.create_output("喷喉直径Dt(mm):", output_layout)
        self.create_output("收敛段长度(mm):", output_layout)
        self.create_output("出口直径De(mm):", output_layout)
        self.create_output("膨胀比Ae/At:", output_layout)

        # Add the output layout to the main layout
        main_layout.addLayout(output_layout)

    def create_input(self, label_text, layout):
        input_layout = QHBoxLayout()

        label = QLabel(label_text, self)
        label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        input_layout.addWidget(label)

        line_edit = QLineEdit(self)
        line_edit.setAlignment(Qt.AlignLeft)
        input_layout.addWidget(line_edit)

        layout.addLayout(input_layout)

        attr_name = self._format_attribute_name(label_text)
        setattr(self, attr_name, line_edit)
        print(f"Created attribute: {attr_name}")

    def create_output(self, label_text, layout):
        output_layout = QHBoxLayout()

        label = QLabel(label_text, self)
        label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        output_layout.addWidget(label)

        line_edit = QLineEdit(self)
        line_edit.setReadOnly(True)
        output_layout.addWidget(line_edit)

        layout.addLayout(output_layout)

        attr_name = self._format_attribute_name(label_text) + '_output'
        setattr(self, attr_name, line_edit)
        print(f"Created attribute: {attr_name}")

    @staticmethod
    def _format_attribute_name(text):
        # Replace non-alphanumeric characters with underscores and remove leading numbers
        return ''.join([char if char.isalnum() else '_' for char in text]).lstrip('_')

    def calculate(self):
        try:
            gamma = float(getattr(self, self._format_attribute_name("比热比(γ):")).text())
            mass_flow = float(getattr(self, self._format_attribute_name("质量流量(Kg/s):")).text())
            pressure = float(getattr(self, self._format_attribute_name("压力(MPa):")).text())
            temperature = float(getattr(self, self._format_attribute_name("温度(K):")).text())
            gas_constant = float(getattr(self, self._format_attribute_name("气体常数(J/(Kg·K)):")).text())
            pressure_export = float(getattr(self, self._format_attribute_name("出口压力(MPa):")).text())
            characteristic_length = float(getattr(self, self._format_attribute_name("特征长度(m):")).text())
            diameter_convergence_ratio_length = float(
                getattr(self, self._format_attribute_name("直径收敛比(Dc/Dt):")).text())
            convergence_half_angle = float(getattr(self, self._format_attribute_name("敛段半角(°):")).text())

            G = sqrt(gamma) * (2 / (gamma + 1)) ** ((gamma + 1) / (2 * (gamma - 1)))
            throat_area = mass_flow / (G * (pressure / sqrt(gas_constant * temperature)))
            compute_throat_diameter = sqrt(throat_area / 3.14159) * 2

            expansion_area_ratio = ((2 / (gamma + 1)) ** (1 / (gamma - 1)) * (
                    (pressure / pressure_export) ** (1 / gamma))) / sqrt(
                ((gamma + 1) / (gamma - 1)) * (1 - ((pressure_export / pressure) ** ((gamma - 1) / gamma))))
            compute_export_diameter = sqrt(throat_area * expansion_area_ratio / 3.14159) * 2

            chamber_volume = throat_area * characteristic_length
            compute_chamber_radius = round(compute_throat_diameter * diameter_convergence_ratio_length + 0.4, 0) / 2
            compute_convergence_length = (compute_chamber_radius * 2 - compute_throat_diameter) / (
                    2 * tan(radians(convergence_half_angle)))
            chamber_volume -= float(compute_convergence_length) * 3.14159 * float(compute_chamber_radius ** 2 +
                                                                                  (compute_throat_diameter / 2) ** 2 +
                                                                                  compute_throat_diameter / 2 * compute_chamber_radius) / 3000
            compute_cylinder_length = chamber_volume * 1000 / (compute_chamber_radius ** 2 * 3.14159)

            getattr(self, self._format_attribute_name("燃烧室直径Dc(mm):") + '_output').setText(
                f'{compute_chamber_radius * 2}')
            getattr(self, self._format_attribute_name("圆筒段长度Lcyl(mm):") + '_output').setText(
                f'{round(compute_cylinder_length + 0.4, 0)}')
            getattr(self, self._format_attribute_name("喷喉直径Dt(mm):") + '_output').setText(
                f'{round(compute_throat_diameter, 3)}')
            getattr(self, self._format_attribute_name("收敛段长度(mm):") + '_output').setText(
                f'{round(compute_convergence_length + 0.4, 0)}')
            getattr(self, self._format_attribute_name("出口直径De(mm):") + '_output').setText(
                f'{round(compute_export_diameter, 3)}')
            getattr(self, self._format_attribute_name("膨胀比Ae/At:") + '_output').setText(
                f'{round(expansion_area_ratio, 3)}')
        except Exception as e:
            QMessageBox.critical(self, "错误", f"计算过程中发生错误:\n{str(e)}")
            print(e)

    def save(self):
        filename, _ = QFileDialog.getSaveFileName(self, "保存文件", "", "Text Files (*.txt)")
        if filename:
            with open(filename, 'w', encoding="utf-8") as file:
                file.write("推力室设计参数:\n")
                file.write(f"燃烧室直径Dc(mm):{getattr(self, '燃烧室直径Dc_mm___output').text()}\n")
                file.write(f"圆筒段长度Lcyl(mm):{getattr(self, '圆筒段长度Lcyl_mm___output').text()}\n")
                file.write(f"喷喉直径Dt(mm):{getattr(self, '喷喉直径Dt_mm___output').text()}\n")
                file.write(f"收敛段长度(mm):{getattr(self, '收敛段长度_mm___output').text()}\n")
                file.write(f"出口直径De(mm):{getattr(self, '出口直径De_mm___output').text()}\n")
                file.write(f"膨胀比Ae/At:{getattr(self, '膨胀比Ae_At__output').text()}")


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    main_window = RocketChamberDesign()
    main_window.show()
    app.exec_()
    app.quit()


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
ZiRui
进士 机友 笔友
文章
6
回复
37
学术分
0
2023/12/12注册,2时42分前活动

<div class="btn btn-default btn-xs" onclick="changeUsername()">修改</div> <a href="XXXXXXXXXXXXXXXXXXXXXXX">Web</a>

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}