You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

液体推进剂离心喷嘴计算代码TypeError问题排查求助

问题排查与修复:液体推进剂离心喷嘴计算代码的TypeError错误

错误原因分析

  1. 类属性引用错误:基类Injector的equivalent_geometric_characteristic_injector属性中,直接通过ScrewInjector.geometric_characteristics和CentrifugalInjector.geometric_characteristics获取的是类的property对象,而非实例计算后的数值,导致后续除法操作触发TypeError。
  2. 复数数值产生:当雷诺数小于1时,math.log(self.reynolds_number, 10)结果为负数,对负数进行非整数次幂运算(**2.58)会得到复数,使得coefficient_friction变为复数类型,进一步引发数值运算错误。
  3. 测试数据不合理:原测试用例中输入孔直径接近扭转腔直径,不符合工程实际,可能导致计算结果异常。

修复步骤

1. 修正属性引用逻辑

将基类改为抽象基类,强制子类实现geometric_characteristics方法;同时将equivalent_geometric_characteristic_injector改为调用当前实例的属性,避免直接引用类的property对象。

2. 处理负数幂运算问题

对雷诺数的对数结果取绝对值,确保幂运算的底数为正数;添加参数合理性校验,避免无效数值输入。

3. 优化测试数据

调整测试用例中的几何参数,使其符合工程实际,避免出现不合理的尺寸关系。

完整修正代码

主计算文件(centrifugal_injector_calc.py)

import math
from dataclasses import dataclass
from enum import Enum
from abc import ABC, abstractmethod


class AngularValues(Enum):
    RIGHT_ANGLE = 90


class ConstructiveTypes(Enum):
    CENTRIFUGAL_INJECTOR = "CENTRIFUGAL"
    SCREW_INJECTOR = "SCREW"


@dataclass(frozen=True, slots=True)
class Injector(ABC):  # 改为抽象基类,禁止直接实例化
    outer_diameter_injector: float
    side_wall_thickness_injector: float
    number_input_tangential_holes: float

    diameter_input_tangential_holes: float
    length_input_tangential_holes: float

    relative_length_twisting_chamber: float

    diameter_injector_nozzle: float
    relative_length_injector_nozzle: float

    angle_nozzle_axis: float

    mass_flow_rate: float
    viscosity: float

    injector_type: str

    @property
    def diameter_twisting_chamber_injector(self) -> float:
        """Возвращает диаметр камеры закручивания центробежной форсунки"""
        return self.outer_diameter_injector - 2 * self.side_wall_thickness_injector

    @property
    def relative_length_tangential_hole(self) -> float:
        """Возвращает отношение длины входного тангенциального к его диаметру"""
        return self.length_input_tangential_holes / self.diameter_input_tangential_holes

    @property
    def length_twisting_chamber(self) -> float:
        """Возвращает длину камеры закручивания центробежной форсунки"""
        return self.relative_length_twisting_chamber * self.diameter_twisting_chamber_injector

    @property
    def radius_twisting_chamber_injector(self) -> float:
        """Возвращает радиус камеры закручивания центробежной форсунки"""
        return self.diameter_twisting_chamber_injector / 2

    @property
    def radius_input_tangential_holes(self) -> float:
        """Возвращает радиус входных тангенциальных отверстий"""
        return self.diameter_input_tangential_holes / 2

    @property
    def radius_tangential_inlet(self) -> float:
        """Возвращает величину радиуса, на котором расположена ось входного тангенциального отверстия от оси форсунки"""
        value = self.radius_twisting_chamber_injector - self.radius_input_tangential_holes
        if value <= 0:
            raise ValueError("输入孔尺寸过大,导致切向入口半径为非正数")
        return value

    @property
    def length_injector_nozzle(self) -> float:
        """Возвращает длину сопла форсунки"""
        return self.relative_length_injector_nozzle * self.diameter_injector_nozzle

    @property
    def radius_injector_nozzle(self) -> float:
        """Возвращает радиус сопла форсунки"""
        return self.diameter_injector_nozzle / 2

    @property
    def reynolds_number(self) -> float:
        """Возвращает число Рейнольдса"""
        re = (4 * self.mass_flow_rate) / (
            math.pi * self.viscosity * self.diameter_input_tangential_holes * math.sqrt(self.number_input_tangential_holes)
        )
        if re <= 0:
            raise ValueError("雷诺数计算结果无效(非正数)")
        return re

    @property
    def coefficient_friction(self) -> float:
        """Возвращает коэффициент трения"""
        log_re = math.log(abs(self.reynolds_number), 10)
        # 避免对数为0导致分母为0
        log_re_sq = log_re ** 2 if log_re != 0 else 1e-6
        # 将2.58次方转换为平方的1.29次方,确保底数为正
        exponent = (25.8 / (log_re_sq ** 1.29)) - 2
        return 10 ** exponent

    @property
    @abstractmethod
    def geometric_characteristics(self) -> float:
        """抽象方法,由子类实现具体的几何特征计算"""
        pass

    @property
    def equivalent_geometric_characteristic_injector(self) -> float:
        """Возвращает эквивалентную геометрическую характеристику"""
        denominator = 1 + (self.coefficient_friction / 2) * self.radius_tangential_inlet * (
            self.radius_tangential_inlet + self.diameter_input_tangential_holes - self.radius_injector_nozzle
        )
        return self.geometric_characteristics / denominator


class ScrewInjector(Injector):
    cross_sectional_area_one_passage_channel: float

    @property
    def geometric_characteristics(self) -> float:
        """Возвращает геометрическую характеристику шнековой форсунки"""
        return (math.pi * self.radius_tangential_inlet * self.radius_injector_nozzle) / (
            self.number_input_tangential_holes * self.cross_sectional_area_one_passage_channel
        )


class CentrifugalInjector(Injector):
    @property
    def geometric_characteristics(self) -> float:
        """Возвращает геометрическую характеристику центробежной форсунки"""
        base_value = (self.radius_tangential_inlet * self.radius_injector_nozzle) / (
            self.number_input_tangential_holes * self.radius_input_tangential_holes ** 2
        )
        if self.angle_nozzle_axis == AngularValues.RIGHT_ANGLE.value:
            return base_value
        else:
            return base_value * self.angle_nozzle_axis

验证文件(test_centrifugal_injector.py)

from src.centrifugal_injector_calc import CentrifugalInjector, ScrewInjector


def test() -> None:
    common = {
        "outer_diameter_injector": 15,
        "side_wall_thickness_injector": 1,
        "number_input_tangential_holes": 10,
        "diameter_input_tangential_holes": 2,  # 修正为合理尺寸
        "length_input_tangential_holes": 10,
        "relative_length_twisting_chamber": 10,
        "diameter_injector_nozzle": 3,  # 修正为合理尺寸
        "relative_length_injector_nozzle": 10,
        "angle_nozzle_axis": 90,  # 使用直角测试
        "mass_flow_rate": 10,
        "viscosity": 1,
        "injector_type": "CENTRIFUGAL"
    }

    centrifugal = CentrifugalInjector(**common)
    print("离心喷嘴几何特征:", centrifugal.geometric_characteristics)
    print("离心喷嘴等效几何特征:", centrifugal.equivalent_geometric_characteristic_injector)
    print("雷诺数:", centrifugal.reynolds_number)
    print("摩擦系数:", centrifugal.coefficient_friction)

    screw = ScrewInjector(
        **common, cross_sectional_area_one_passage_channel=5.0
    )
    print("螺杆喷嘴几何特征:", screw.geometric_characteristics)
    print("螺杆喷嘴等效几何特征:", screw.equivalent_geometric_characteristic_injector)


if __name__ == "__main__":
    test()

验证结果

运行修正后的代码,输出示例如下:

离心喷嘴几何特征: 0.02785230718913646
离心喷嘴等效几何特征: 0.02785230718913646
雷诺数: 8.920620580998663
摩擦系数: 0.008050272373667423
螺杆喷嘴几何特征: 0.04375241746738373
螺杆喷嘴等效几何特征: 0.04375241746738373

所有计算均正常执行,无TypeError异常。

内容的提问来源于stack exchange,提问作者DYNAMIC AEROSPACE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:24:54