Initial commit
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
import numpy as np
|
||||
from scipy.interpolate import interp1d
|
||||
|
||||
class ControlSchedule:
|
||||
"""
|
||||
航空发动机控制计划 (Control Schedule)
|
||||
输入: PLA (角度 0~110)
|
||||
输出: Target NH, Target NL (0.0~1.0), Limit T5
|
||||
"""
|
||||
def __init__(self):
|
||||
|
||||
# ==========================================
|
||||
# 1. 定义控制计划数据点
|
||||
# ==========================================
|
||||
|
||||
# --- NH (高压转速) 计划 ---
|
||||
# 依据图片1:在 PLA=80 时达到 1.0
|
||||
# 0 -> 14.99: 0
|
||||
# 15.0 : 0.7
|
||||
# 80.0 : 1.0
|
||||
self._pla_nh = np.array([0.0, 14.99, 15.0, 80.0, 110.0])
|
||||
self._val_nh = np.array([0.0, 0.0, 0.70, 1.00, 1.00])
|
||||
|
||||
# --- NL (低压转速) 计划 ---
|
||||
# 依据图片2:在 PLA=90 时达到 1.0
|
||||
# 0 -> 14.99: 0
|
||||
# 15.0 : 0.5
|
||||
# 90.0 : 1.0
|
||||
self._pla_nl = np.array([0.0, 14.99, 15.0, 90.0, 110.0])
|
||||
self._val_nl = np.array([0.0, 0.0, 0.50, 1.00, 1.00])
|
||||
|
||||
# --- 限制值 (T5, P3) 计划 ---
|
||||
# 保持原有逻辑:在 PLA=100 时达到最大限制
|
||||
self._pla_lim = np.array([0.0, 14.99, 15.0, 100.0, 110.0])
|
||||
|
||||
# Limit T5 (温度限制) [K]
|
||||
# 15度时1200K, 100度时1500K
|
||||
self._val_t5 = np.array([1200.0, 1200.0, 1200.0, 1500.0, 1500.0])
|
||||
|
||||
# Limit P3 (压力限制) [kPa]
|
||||
# 15度时2000kPa, 100度时2500kPa
|
||||
self._val_p3 = np.array([800.0, 800.0, 2000.0, 2500.0, 2500.0])
|
||||
|
||||
|
||||
# ==========================================
|
||||
# 2. 构建插值函数
|
||||
# ==========================================
|
||||
self.f_nh = interp1d(self._pla_nh, self._val_nh, kind='linear', fill_value="extrapolate")
|
||||
self.f_nl = interp1d(self._pla_nl, self._val_nl, kind='linear', fill_value="extrapolate")
|
||||
self.f_t5 = interp1d(self._pla_lim, self._val_t5, kind='linear', fill_value="extrapolate")
|
||||
self.f_p3 = interp1d(self._pla_lim, self._val_p3, kind='linear', fill_value="extrapolate")
|
||||
|
||||
def get_targets(self, pla):
|
||||
"""
|
||||
输入: pla (角度, 0.0 ~ 110.0)
|
||||
"""
|
||||
# 稍微做个限幅,防止超出定义域太多
|
||||
pla = np.clip(pla, 0.0, 110.0)
|
||||
|
||||
t_nh = float(self.f_nh(pla))
|
||||
t_nl = float(self.f_nl(pla))
|
||||
l_t5 = float(self.f_t5(pla))
|
||||
l_p3 = float(self.f_p3(pla))
|
||||
|
||||
return t_nh, t_nl, l_t5, l_p3
|
||||
|
||||
# ==========================================
|
||||
# 自测代码
|
||||
# ==========================================
|
||||
if __name__ == "__main__":
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
sch = ControlSchedule()
|
||||
|
||||
# 测试关键点
|
||||
test_plas = [0, 10, 14.9, 15.0, 15.1, 57.5, 100, 105]
|
||||
print(f"{'PLA':<10} {'NH':<10} {'NL':<10}")
|
||||
print("-" * 30)
|
||||
for p in test_plas:
|
||||
nh, nl, _, _ = sch.get_targets(p)
|
||||
print(f"{p:<10} {nh:<10.4f} {nl:<10.4f}")
|
||||
|
||||
# 画图确认阶跃形状
|
||||
x = np.linspace(0, 110, 500)
|
||||
y_nh = [sch.get_targets(i)[0] for i in x]
|
||||
|
||||
plt.figure()
|
||||
plt.plot(x, y_nh, label='Target NH')
|
||||
plt.axvline(15, color='r', linestyle='--', alpha=0.5, label='Idle Point (15 deg)')
|
||||
plt.title("PLA to Engine Speed Schedule")
|
||||
plt.xlabel("PLA (Degree)")
|
||||
plt.ylabel("Normalized Speed")
|
||||
plt.legend()
|
||||
plt.grid(True)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user