液体推进剂离心喷嘴计算代码TypeError问题排查求助
问题排查与修复:液体推进剂离心喷嘴计算代码的TypeError错误
错误原因分析
- 类属性引用错误:基类
Injector的equivalent_geometric_characteristic_injector属性中,直接通过ScrewInjector.geometric_characteristics和CentrifugalInjector.geometric_characteristics获取的是类的property对象,而非实例计算后的数值,导致后续除法操作触发TypeError。 - 复数数值产生:当雷诺数小于1时,
math.log(self.reynolds_number, 10)结果为负数,对负数进行非整数次幂运算(**2.58)会得到复数,使得coefficient_friction变为复数类型,进一步引发数值运算错误。 - 测试数据不合理:原测试用例中输入孔直径接近扭转腔直径,不符合工程实际,可能导致计算结果异常。
修复步骤
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
相关产品推荐
相关产品推荐

