基于MATLAB_SIMULINK_SIMSCAPE建模的用于组件尺寸的电动和混合动力飞机模型
基于MATLAB/SIMULINK/SIMSCAPE建模的用于组件尺寸的电动和混合动力飞机模型
第一步:主脚本 (AircraftSizingMain.m)
在 MATLAB 中运行此脚本,它将定义参数并启动仿真。
matlab
编辑
1%% Aircraft Component Sizing Simulation Script
2% 适用于电动 (AE) 和混合动力 (Hybrid) 飞机概念设计
3clear; clc; close all;
4
5%% 1. 飞机总体参数 (可修改以进行尺寸迭代)
6Aircraft = struct();
7Aircraft.MTOW = 1200; % 最大起飞重量 (kg)
8Aircraft.WingArea = 14.5; % 机翼面积 (m^2)
9Aircraft.CD0 = 0.025; % 零升阻力系数
10Aircraft.AR = 12.0; % 展弦比
11Aircraft.e = 0.85; % 奥斯瓦尔德效率因子
12Aircraft.PropEff = 0.82; % 螺旋桨效率 (恒定假设,也可做成查表)
13
14%% 2. 推进系统配置 (选择 ‘Electric’ 或 ‘Hybrid’)
15Config.Type = ‘Electric’; % 选项: ‘Electric’, ‘Hybrid’
16
17if strcmp(Config.Type, ‘Electric’)
18 % — 纯电动配置 —
19 Config.BatCapacity = 60; % kWh
20 Config.BatVoltage = 400; % V
21 Config.MotorMaxPower = 150;% kW
22 Config.MotorEff = 0.94; % 电机峰值效率
23 Config.FuelMass = 0; % kg
24 Config.GeneratorPower = 0; % kW
25
26elseif strcmp(Config.Type, ‘Hybrid’)
27 % — 串联混合动力配置 —
28 Config.BatCapacity = 20; % kWh (较小,用于缓冲)
29 Config.BatVoltage = 400; % V
30 Config.MotorMaxPower = 150;% kW
31 Config.MotorEff = 0.94;
32 Config.FuelMass = 80; % kg (汽油)
33 Config.GeneratorPower = 80;% kW (增程器额定功率)
34 Config.ICE_SFC = 0.35; % kg/kWh (内燃机燃油消耗率)
35end
36
37%% 3. 任务剖面定义 (Mission Profile)
38% 时间(s), 高度(m), 空速(m/s)
39% 阶段: 起飞 -> 爬升 -> 巡航 -> 下降 -> 降落
40TimeVec = [0, 300, 900, 3600, 4200, 4500]‘;
41AltVec = [0, 500, 1500, 1500, 500, 0]’;
42VelVec = [0, 40, 60, 65, 50, 35]‘;
43
44% 插值生成每秒数据
45t_sim = (0:1:4500)’;
46h_ref = interp1(TimeVec, AltVec, t_sim, ‘linear’);
47v_ref = interp1(TimeVec, VelVec, t_sim, ‘linear’);
48
49%% 4. 初始状态
50SOC_init = 1.0; % 初始电量 100%
51Fuel_init = Config.FuelMass;
52
53%% 5. 运行 Simulink 模型
54% 假设模型文件名为 ‘AircraftSizingModel.slx’
55% 将变量传入工作区供 Simulink 使用
56assignin(‘base’, ‘Aircraft’, Aircraft);
57assignin(‘base’, ‘Config’, Config);
58assignin(‘base’, ‘t_sim’, t_sim);
59assignin(‘base’, ‘h_ref’, h_ref);
60assignin(‘base’, ‘v_ref’, v_ref);
61assignin(‘base’, ‘SOC_init’, SOC_init);
62assignin(‘base’, ‘Fuel_init’, Fuel_init);
63
64model_name = ‘AircraftSizingModel’;
65if ~exist([model_name ‘.slx’], ‘file’)
66 warning(‘模型文件未找到,请手动创建 Simulink 模型 (见下方指南)。此处仅演示数据准备。’);
67 % 为了演示,这里不调用 sim(),实际使用时取消下行注释
68 % sim_out = sim(model_name);
69else
70 disp(‘开始仿真…’);
71 sim_out = sim(model_name);
72
73 % 后处理绘图
74 figure;
75 subplot(3,1,1); plot(t_sim, h_ref, ‘b’, t_sim, sim_out.logsout.get(‘Altitude’).Values.Time, sim_out.logsout.get(‘Altitude’).Values.Data, ‘r–’);
76 legend(‘参考高度’, ‘仿真高度’); ylabel(‘高度 (m)’); grid on;
77
78 subplot(3,1,2); plot(t_sim, v_ref, ‘b’, t_sim, sim_out.logsout.get(‘Velocity’).Values.Time, sim_out.logsout.get(‘Velocity’).Values.Data, ‘r–’);
79 legend(‘参考速度’, ‘仿真速度’); ylabel(‘速度 (m/s)’); grid on;
80
81 subplot(3,1,3);
82 if strcmp(Config.Type, ‘Electric’)
83 plot(t_sim, sim_out.logsout.get(‘SOC’).Values.Time, sim_out.logsout.get(‘SOC’).Values.Data);
84 ylabel(‘电池 SOC’);
85 else
86 yyaxis left; plot(t_sim, sim_out.logsout.get(‘SOC’).Values.Time, sim_out.logsout.get(‘SOC’).Values.Data); ylabel(‘SOC’);
87 yyaxis right; plot(t_sim, sim_out.logsout.get(‘FuelMass’).Values.Time, sim_out.logsout.get(‘FuelMass’).Values.Data); ylabel(‘燃油质量 (kg)’);
88 end
89 xlabel(‘时间 (s)’); grid on;
90 disp(‘仿真完成。检查图表以评估组件尺寸是否满足任务需求。’);
91end
第二步:Simulink 模型搭建与核心代码块
请在 Simulink 中新建模型 AircraftSizingModel.slx,并按照以下结构搭建。你需要使用 MATLAB Function 模块来实现具体的物理方程。
- 模型结构图 (逻辑流)
任务剖面 (From Workspace) --> 飞行控制器 (PID) --> 所需推力计算 --> 能量管理系统 (EMS) --> 推进系统 (电机/发动机/电池) --> 飞机动力学 (6DOF 或 简化点质量) --> 状态输出 (To Workspace) - 关键模块代码 (复制到 MATLAB Function 模块中)
A. 空气动力学与所需推力 (Aerodynamics & Thrust Req)
输入: V (速度), h (高度), Weight (当前重量), Accel_req (所需加速度)
输出: Thrust_req (所需推力), Drag (阻力), Lift (升力)
matlab
编辑
1function [Thrust_req, Drag, Lift] = AeroDynamics(V, h, Weight, Accel_req, params)
2%#codegen
3% 参数解包
4S = params.WingArea;
5CD0 = params.CD0;
6AR = params.AR;
7e = params.e;
8rho_0 = 1.225; % 海平面空气密度
9
10% 简单大气模型 (指数模型)
11rho = rho_0 * exp(-h / 8500);
12
13% 升力系数 (假设平飞或小幅爬升,L ≈ W)
14% 更精确的做法是解 L = Wcos(gamma),这里简化为 L=W 用于尺寸估算
15if V < 1, V = 1; end % 防止除零
16CL = (2 * Weight) / (rho * V^2 * S);
17
18% 阻力系数 (抛物线极曲线)
19K = 1 / (pi * AR * e);
20CD = CD0 + K * CL^2;
21
22% 计算力
23Drag = 0.5 * rho * V^2 * S * CD;
24Lift = 0.5 * rho * V^2 * S * CL;
25
26% 牛顿第二定律: T - D = ma + Wsin(gamma)
27% 简化:假设小角度爬升,sin(gamma) ≈ (dh/dt)/V
28% 这里我们直接利用输入的 Accel_req 代表 (a + gsin(gamma)) 的总等效加速度需求
29Mass = Weight / 9.81;
30Thrust_req = Drag + Mass * Accel_req;
31
32% 限制推力不能为负 (不考虑反推)
33if Thrust_req < 0, Thrust_req = 0; end
34end
B. 能量管理系统与推进链 (EMS & Propulsion Chain)
这是混合动力的核心。根据配置计算电池电流、燃油消耗。
输入: Thrust_req, V, SOC, FuelMass, Config, Aircraft
输出: Thrust_avail, dSOC_dt, dFuel_dt, MotorPower, GenPower
matlab
编辑
1function [Thrust_avail, dSOC_dt, dFuel_dt, P_motor, P_gen] = PropulsionSystem(Thrust_req, V, SOC, FuelMass, Config, Aircraft)
2%#codegen
3
4P_mech_req = Thrust_req * V / Aircraft.PropEff; % 轴功率需求 (W)
5P_mech_req = min(P_mech_req, Config.MotorMaxPower * 1000); % 限制最大功率
6
7P_elec_load = 0; % 电网负载
8P_gen_out = 0; % 发电机输出
9fuel_flow = 0; % 燃油流量 (kg/s)
10
11if strcmp(Config.Type, ‘Electric’)
12 % — 纯电动模式 —
13 P_elec_load = P_mech_req / Config.MotorEff;
14 P_gen_out = 0;
15
16 % 电池模型 (简单内阻模型可在此添加)
17 % P = V * I => I = P / V
18 I_bat = P_elec_load / Config.BatVoltage;
19
20 % dSOC/dt = -I / Capacity(Ah)
21 Cap_Ah = (Config.BatCapacity * 1000) / Config.BatVoltage;
22 dSOC_dt = -I_bat / (Cap_Ah * 3600); % 转换为每小时单位再归一化
23
24 % 限制 SOC 变化率 (防止过放,简单截断)
25 if SOC <= 0.05 && dSOC_dt < 0
26 dSOC_dt = 0;
27 P_elec_load = 0; % 电量耗尽,推力丧失
28 end
29
30 P_motor = P_mech_req;
31 Thrust_avail = (P_motor * Config.MotorEff * Aircraft.PropEff) / max(V, 1);
32
33elseif strcmp(Config.Type, ‘Hybrid’)
34 % — 串联混合动力策略 (恒温器式 Thermostat 或 功率跟随) —
35 % 策略:如果需求功率 > 发电机额定功率,电池放电补充;否则发电机供电并给电池充电(可选)
36
37 P_gen_max = Config.GeneratorPower * 1000;
38
39 if P_mech_req > P_gen_max
40 % 高功率需求 (如爬升): 发电机满负荷 + 电池补充
41 P_gen_out = P_gen_max;
42 P_elec_from_bat = P_mech_req / Config.MotorEff - P_gen_out;
43
44 % 计算燃油消耗 (发电机输出 / 效率 / 热值)
45 % 简化:SFC (kg/kWh) -> kg/s = P(kW) * SFC / 3600
46 fuel_flow = (P_gen_out/1000) * Config.ICE_SFC / 3600;
47
48 else
49 % 低功率需求 (巡航): 仅由发电机供电,多余功率可充电 (此处简化为不充电,仅维持)
50 P_gen_out = P_mech_req / Config.MotorEff; % 考虑电机效率前的电功率
51 % 增加一点发电机效率损耗假设 0.9
52 P_gen_mech_in = P_gen_out / 0.9;
53 fuel_flow = (P_gen_mech_in/1000) * Config.ICE_SFC / 3600;
54
55 P_elec_from_bat = 0;
56
57 % 简单的充电逻辑:如果 SOC < 0.3 且功率有富余,可以充电,此处省略以保持代码简洁
58 end
59
60 % 电池动态
61 if P_elec_from_bat > 0
62 I_bat = P_elec_from_bat / Config.BatVoltage;
63 Cap_Ah = (Config.BatCapacity * 1000) / Config.BatVoltage;
64 dSOC_dt = -I_bat / (Cap_Ah * 3600);
65 else
66 dSOC_dt = 0; % 暂不模拟充电
67 end
68
69 if FuelMass <= 0.5
70 fuel_flow = 0; P_gen_out = 0; % 燃油耗尽
71 end
72
73 P_motor = P_mech_req;
74 Thrust_avail = (P_motor * Config.MotorEff * Aircraft.PropEff) / max(V, 1);
75end
76
77% 输出保护
78if isnan(dSOC_dt), dSOC_dt = 0; end
79if isnan(fuel_flow), fuel_flow = 0; end
80dFuel_dt = -fuel_flow;
81end
C. 飞机动力学 (简化点质量模型 Point Mass Dynamics)
输入: Thrust, Drag, Weight, Gamma_cmd (来自控制器)
输出: V_dot, h_dot, New_Weight
matlab
编辑
1function [V_dot, h_dot, W_dot] = FlightDynamics(Thrust, Drag, Weight, Gamma, V)
2%#codegen
3g = 9.81;
4Mass = Weight / g;
5
6% 避免除以零
7if Mass < 10, Mass = 10; end
8if V < 0.1, V = 0.1; end
9
10% 纵向动力学方程
11% F_x = T - D - W*sin(gamma) = m * dV/dt
12V_dot = (Thrust - Drag - Weight * sin(Gamma)) / Mass;
13
14% F_z (垂直速度)
15h_dot = V * sin(Gamma);
16
17% 重量变化 (燃油消耗)
18% 电池重量变化通常在尺寸设计中视为常数或分段,此处仅处理燃油
19W_dot = 0; % 电池重量不变,燃油在上一级处理或直接在这里减
20% 注意:如果在 Propulsion 模块计算了 dFuel_dt,这里可以直接用
21% 为了模块化,建议重量变化在顶层积分,这里只输出加速度
22end
第三步:Simulink 连线指南
Clock 模块:提供当前时间 t。
From Workspace 模块 (x3):
分别读取 t_sim, h_ref (作为高度指令), v_ref (作为速度指令)。
PID Controller 模块 (x2):
速度环:输入 (v_ref - V_actual),输出 Accel_req (加速度需求)。
高度环 (可选,用于自动爬升):输入 (h_ref - h_actual),输出 Gamma_cmd (爬升角指令)。简化版可直接根据任务剖面预设 Gamma。
MATLAB Function (AeroDynamics):
输入:V, h, Weight, Accel_req, Struct: params (使用 Bus Creator 将 Aircraft 结构体打包)。
输出:Thrust_req。
MATLAB Function (PropulsionSystem):
输入:Thrust_req, V, SOC, FuelMass, Struct: Config, Struct: Aircraft。
输出:Thrust_avail, dSOC_dt, dFuel_dt。
注意:确保 Thrust_avail 反馈给动力学模块。
Integrator 模块 (x3):
SOC: 输入 dSOC_dt, 初值 SOC_init。
FuelMass: 输入 dFuel_dt, 初值 Fuel_init。
Weight: 输入 dFuel_dt * 9.81 (燃油重力变化), 初值 MTOW * 9.81。
Velocity: 输入 V_dot (来自动力学模块), 初值 0。
Altitude: 输入 h_dot, 初值 0。
MATLAB Function (FlightDynamics):
连接推力、阻力、重量,计算 V_dot 和 h_dot。
To Workspace 模块:
记录 Velocity, Altitude, SOC, FuelMass 以便主脚本绘图。格式选择 Structure with Time。
第四步:如何使用此模型进行组件尺寸设计
定义设计空间:在主脚本中,不要只给单一值,而是使用循环。
matlab
编辑
1battery_sizes = [40, 60, 80]; % kWh
2motor_powers = [100, 150, 200]; % kW
3
4results = [];
5
6for bat = battery_sizes
7 for mot = motor_powers
8 Config.BatCapacity = bat;
9 Config.MotorMaxPower = mot;
10
11 % 更新工作区变量
12 assignin(‘base’, ‘Config’, Config);
13
14 % 运行仿真
15 sim_out = sim(‘AircraftSizingModel’);
16
17 % 提取结果:最终 SOC, 是否完成任务 (高度/速度跟踪误差), 剩余燃油
18 final_SOC = sim_out.logsout.get(‘SOC’).Values.Data(end);
19 mission_success = (final_SOC > 0.1); % 假设剩余10%算成功
20
21 results = [results; bat, mot, final_SOC, mission_success];
22 end
23end
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)