Initial commit
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.ticker as ticker
|
||||
import numpy as np
|
||||
from core_model import AeroEngineDLL
|
||||
import os
|
||||
|
||||
# ==========================================
|
||||
# 范围测试示例
|
||||
# ==========================================
|
||||
|
||||
def run_simulation():
|
||||
print("=== 开始发动机控制量范围测试 (优化版) ===")
|
||||
|
||||
# 1. 初始化模型
|
||||
dll_path = os.path.join(os.path.dirname(__file__), "libEngine.dll")
|
||||
if not os.path.exists(dll_path):
|
||||
dll_path = os.path.join(os.path.dirname(__file__), "..", "libEngine.dll")
|
||||
|
||||
sim = AeroEngineDLL(dll_path)
|
||||
out = sim.reset()
|
||||
|
||||
# 初始状态
|
||||
current_wf = 100.0
|
||||
current_add_power = 90000.0
|
||||
current_a8 = 0.1
|
||||
current_fan_vane = 0.0
|
||||
current_comp_vane = 0.0
|
||||
|
||||
# 数据记录
|
||||
data = {
|
||||
'time': [], 'nh': [], 'nl': [], 't5': [], 'p3': [], 'wf': [],
|
||||
'a8': [], 'fan_vane': [], 'comp_vane': []
|
||||
}
|
||||
|
||||
# 辅助记录函数
|
||||
def record(t, o, wf, a8, fv, cv):
|
||||
data['time'].append(t)
|
||||
data['nh'].append(o.NH)
|
||||
data['nl'].append(o.NL)
|
||||
data['t5'].append(o.T5t)
|
||||
data['p3'].append(o.P3s)
|
||||
data['wf'].append(wf)
|
||||
data['a8'].append(a8)
|
||||
data['fan_vane'].append(fv)
|
||||
data['comp_vane'].append(cv)
|
||||
|
||||
record(0.0, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
total_time = 0.0
|
||||
dt = 0.02
|
||||
|
||||
# ==========================================
|
||||
# Phase 1: 起动与稳态 (0 - 20s)
|
||||
# ==========================================
|
||||
print("Phase 1: 起动与稳态 (0-20s)...")
|
||||
while total_time < 20.0:
|
||||
if out.NH > 0.25 and current_add_power > 0:
|
||||
current_add_power = 0.0
|
||||
current_wf = 2000.0 # 提高稳态燃油至 2000 (原 1000) 以测试高工况下的导叶效果
|
||||
|
||||
action = {
|
||||
'Wf': current_wf, 'AddPower': current_add_power, 'A8': current_a8,
|
||||
'FanVane': current_fan_vane, 'CompVane': current_comp_vane
|
||||
}
|
||||
out = sim.step(action)
|
||||
total_time += dt
|
||||
record(total_time, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
# ==========================================
|
||||
# Phase 2: A8 扫描 (Step Response)
|
||||
# A8: 0.01 -> 1.0
|
||||
# ==========================================
|
||||
print("Phase 2: 测试 A8 阶跃变化 (0.01 -> 1.0)...")
|
||||
steps_per_point = 50 # 1秒 per point
|
||||
a8_targets = np.linspace(0.01, 1.0, 40)
|
||||
|
||||
for val in a8_targets:
|
||||
current_a8 = val
|
||||
for _ in range(steps_per_point):
|
||||
action = {'Wf': current_wf, 'AddPower': 0.0, 'A8': current_a8, 'FanVane': current_fan_vane, 'CompVane': current_comp_vane}
|
||||
out = sim.step(action)
|
||||
total_time += dt
|
||||
record(total_time, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
# 恢复 A8 并稳定
|
||||
current_a8 = 0.1
|
||||
print("Restabilizing A8...")
|
||||
for _ in range(100): # 2秒
|
||||
action = {'Wf': current_wf, 'AddPower': 0.0, 'A8': current_a8, 'FanVane': current_fan_vane, 'CompVane': current_comp_vane}
|
||||
out = sim.step(action)
|
||||
total_time += dt
|
||||
record(total_time, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
# ==========================================
|
||||
# Phase 3: Fan Vane 扫描 (Step Response)
|
||||
# Range: -20 -> +20 度
|
||||
# ==========================================
|
||||
print("Phase 3: 测试 Fan Vane 阶跃变化 (-20 -> 20)...")
|
||||
vane_targets = np.linspace(-20.0, 20.0, 40)
|
||||
|
||||
for val in vane_targets:
|
||||
current_fan_vane = val
|
||||
for _ in range(steps_per_point):
|
||||
action = {'Wf': current_wf, 'AddPower': 0.0, 'A8': current_a8, 'FanVane': current_fan_vane, 'CompVane': current_comp_vane}
|
||||
out = sim.step(action)
|
||||
total_time += dt
|
||||
record(total_time, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
# 恢复 Fan Vane 并稳定
|
||||
current_fan_vane = 0.0
|
||||
print("Restabilizing Fan Vane...")
|
||||
for _ in range(100):
|
||||
action = {'Wf': current_wf, 'AddPower': 0.0, 'A8': current_a8, 'FanVane': current_fan_vane, 'CompVane': current_comp_vane}
|
||||
out = sim.step(action)
|
||||
total_time += dt
|
||||
record(total_time, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
# ==========================================
|
||||
# Phase 4: Comp Vane 扫描 (Step Response)
|
||||
# Range: -20 -> +20 度
|
||||
# ==========================================
|
||||
print("Phase 4: 测试 Comp Vane 阶跃变化 (-20 -> 20)...")
|
||||
|
||||
for val in vane_targets:
|
||||
current_comp_vane = val
|
||||
for _ in range(steps_per_point):
|
||||
action = {'Wf': current_wf, 'AddPower': 0.0, 'A8': current_a8, 'FanVane': current_fan_vane, 'CompVane': current_comp_vane}
|
||||
out = sim.step(action)
|
||||
total_time += dt
|
||||
record(total_time, out, current_wf, current_a8, current_fan_vane, current_comp_vane)
|
||||
|
||||
sim.close()
|
||||
print("测试结束,正在绘图...")
|
||||
plot_range_test(data)
|
||||
|
||||
def plot_range_test(data):
|
||||
t = data['time']
|
||||
|
||||
plt.rcParams['font.family'] = 'sans-serif'
|
||||
fig, axes = plt.subplots(5, 1, figsize=(12, 16), sharex=True)
|
||||
|
||||
# 1. Speed (NH & NL)
|
||||
axes[0].plot(t, data['nh'], color='blue', label='NH')
|
||||
axes[0].plot(t, data['nl'], color='cyan', linestyle='--', label='NL')
|
||||
axes[0].set_ylabel('Speed (%)')
|
||||
axes[0].grid(True, linestyle='--', alpha=0.7)
|
||||
axes[0].legend(loc='upper right')
|
||||
axes[0].set_title('Engine Response to Control Inputs')
|
||||
|
||||
# 2. T5
|
||||
axes[1].plot(t, data['t5'], color='red', label='T5')
|
||||
axes[1].set_ylabel('T5 (K)')
|
||||
axes[1].grid(True, linestyle='--', alpha=0.7)
|
||||
axes[1].legend(loc='upper right')
|
||||
|
||||
# 3. P3
|
||||
axes[2].plot(t, data['p3'], color='orange', label='P3')
|
||||
axes[2].set_ylabel('P3 (kPa)')
|
||||
axes[2].grid(True, linestyle='--', alpha=0.7)
|
||||
axes[2].legend(loc='upper right')
|
||||
|
||||
# 4. A8 Input
|
||||
axes[3].plot(t, data['a8'], color='green', label='A8 Input')
|
||||
axes[3].set_ylabel('A8 (m^2)')
|
||||
axes[3].grid(True, linestyle='--', alpha=0.7)
|
||||
axes[3].legend(loc='upper right')
|
||||
axes[3].yaxis.set_major_locator(ticker.MaxNLocator(nbins=5))
|
||||
axes[3].minorticks_on()
|
||||
axes[3].grid(which='minor', linestyle=':', alpha=0.4)
|
||||
|
||||
# 5. Vane Inputs
|
||||
axes[4].plot(t, data['fan_vane'], color='purple', label='Fan Vane')
|
||||
axes[4].plot(t, data['comp_vane'], color='brown', label='Comp Vane')
|
||||
axes[4].set_ylabel('Vane Angle (deg)')
|
||||
axes[4].set_xlabel('Time (s)')
|
||||
axes[4].grid(True, linestyle='--', alpha=0.7)
|
||||
axes[4].legend(loc='upper right')
|
||||
axes[4].yaxis.set_major_locator(ticker.MaxNLocator(nbins=5))
|
||||
axes[4].minorticks_on()
|
||||
axes[4].grid(which='minor', linestyle=':', alpha=0.4)
|
||||
|
||||
plt.tight_layout()
|
||||
save_path = os.path.join(os.path.dirname(__file__), 'range_test_result.png')
|
||||
plt.savefig(save_path)
|
||||
print(f"结果图已保存至: {save_path}")
|
||||
plt.show()
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_simulation()
|
||||
Reference in New Issue
Block a user