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()