基于Yalmip的区域多能源系统集群协同优化与联合需求侧响应复现

发布时间:2026/9/10 19:42:55
基于Yalmip的区域多能源系统集群协同优化与联合需求侧响应复现 去年我在复现这篇EI论文的时候第一遍把代码跑通用了一个星期中间踩了不知道多少坑。现在回头看模型本身并不复杂真正麻烦的是怎么把论文里那段抽象的描述翻译成Yalmip里可计算的约束。这篇文章就把整个复现过程掰开揉碎讲清楚——从问题建模、系统架构设计到Matlab代码实现、求解器配置再到调试和避坑完整走一遍。适合正在做综合能源、多能互补方向研究的同学也适合那些拿到论文代码却总跑不通、想搞清楚每一个变量在干什么的读者。它到底解决什么问题说白了就是当多个区域能源系统放在一起协同运行时怎么通过需求侧响应来降低整体运行成本同时让电、热、冷、气几种能源在用户侧也能灵活转换。1. 项目背景与研究意义1.1 为什么要做区域多能源系统集群协同优化传统电力系统调度是“源随荷动”——发电侧拼了命去追负荷用户侧被动用电系统灵活性全靠火电机组的爬坡和备用容量撑着。但现在系统的形态变了风电、光伏大量接入负荷侧也出现了大量电锅炉、电制冷机、电动汽车这类可调节设备。单一能源系统的调度空间越来越小成本越来越高。区域多能源系统Integrated Energy System, IES的思路是把电、气、热、冷四种能源网络放在一起看通过能源转换设备热电联产机组、电转气、电锅炉、吸收式制冷机等把它们耦合起来把原本割裂的调度问题变成一个整体优化问题。比如电网压力大的时候可以让CHP机组多发电、余热用来供热减少电锅炉的用电反过来热负荷高峰的时候燃气锅炉多出力CHP少发电电网压力就小了。这种跨能源的互补能力就是多能源系统最核心的价值。而“集群协同优化”更进一步——不是一个IES单独跑而是多个IES构成集群彼此之间可以交换电能和热能。单个IES内部的设备容量有限、调节能力有限但如果集群内的多个系统联合起来A系统的富余风电可以送给B系统B系统的热备用可以支援A系统整个集群的可靠性、经济性都能提上来。这个和电力系统中的“分布式资源聚合”思路同源区别在于这里聚合的对象不是单一分布式电源而是整个多能源系统。1.2 联合需求侧响应在协同优化里的角色定位需求侧响应Demand Response, DR是让用户侧从“被动”走向“主动”的关键手段。传统DR多指电力需求响应——分时电价引导用户错峰用电或者直接切掉一部分可中断负荷。但在多能源系统里需求侧响应不再只是“省电”而是“优化用能结构”。联合需求侧响应Joint Demand Response的核心是把电、热、冷、气负荷放在同一个响应框架里考虑。用户可以做的选择不只是“这个时段少用电”还包括“这个时段不用电、改用天然气”“不用电制冷、改用热驱动的吸收式制冷”。也就是说负荷不再是刚性的而是可以在不同能源品种之间转移和替代。这种替代能力对系统运行来说非常有价值——低谷时段电便宜、风电又多那就鼓励用户多用电、少用气高峰时段电贵那就鼓励用户多用气、减少电负荷。在集群协同优化模型里加入联合需求侧响应之后优化问题就不再只是供给侧怎么调度设备而是供给侧和需求侧联动起来一起优化。用户侧的可调节能力直接变成模型里的决策变量。本文复现的模型正是沿着这个思路来的上层做多个IES集群的协同优化下层用联合需求侧响应引导用户调整用能习惯实现源—网—荷全链条的协调。1.3 这篇复现代码到底解决什么问题放到实际工程里这个模型解决的是三类问题第一是经济性。多能互补本身就是降本手段叠加需求侧响应后负荷曲线更平缓峰值购能需求下降高电价时段的购能成本也会明显降低。第二是可再生能源消纳。风电光伏的反调峰特性一直是个老大难问题通过热负荷和冷负荷的平移、替代相当于给风电让出了更多用电空间。第三是设备利用率。当多个区域能源系统集群协同运行时集群内的设备可以互相备用避免每个系统都为了极端场景去扩容设备整体利用率提升。我把这套模型在Matlab里用Yalmip求解器完整实现了一遍可以输出电功率平衡、热功率平衡、各设备出力曲线、负荷需求响应前后的对比图以及集群间交换功率的曲线。代码框架也可以直接迁移到其他容量配置、其他参数场景不需要改模型结构。2. 核心模型设计与数学原理2.1 系统架构与拓扑设定复现的第一步不是写代码而是把论文里的系统拓扑图还原成数学结构。我搭建的是一个包含三个区域IES的集群系统每个IES内部包含以下设备风力发电机组WT可再生能源出力按预测曲线给定不可调度热电联产机组CHP以天然气为燃料同时输出电和热存在热电比约束燃气锅炉GB只产热作为热负荷的补充热源电锅炉EB用电产热和燃气锅炉形成“气—电”热源互补吸收式制冷机AC用热驱动制冷把热负荷转换为冷负荷电制冷机EC用电驱动制冷与AC形成替代储能系统ESS存储电能平抑波动。各IES之间通过联络线进行电能交换通过热网管道进行热能交换。整体结构可以看作一个三层模型设备层是各IES内部的能源转换和储能设备系统层是每个IES内部的电、热、冷、气平衡集群层是多个IES之间的功率交互。之所以选三个IES组成集群是因为这个规模能完整呈现“集群协同”的核心逻辑——如果只有一个IES就成了单体优化如果太多计算复杂度会明显上升不利于验证模型。三个IES刚好能展示多次功率交换交互的过程。2.2 目标函数构建目标函数是所有优化模型的心脏。这篇复现采用的最小化总运行成本包含四部分购电成本从上级电网购买电能的花费分时电价会影响这部分成本购气成本天然气购买成本供应CHP和燃气锅炉设备运行维护成本所有可调度设备的运维成本通常与出力成线性关系需求侧响应补偿成本用户参与负荷响应后需要对用户进行经济补偿。目标函数数学表示如下 $$ \min C \sum_{t \in T} \left[ c_t^{grid}P_t^{grid} c^{gas}(F_t^{CHP} F_t^{GB}) \sum_{i \in I} c_i^{OM}P_{i,t} C_t^{DR} \right] $$其中第一项是购电成本第二项是购气成本第三项是运维成本第四项是DR补偿成本。在代码里这个目标函数直接用Yalmip的sum()表达式实现所有成本项都是决策变量的线性表达式所以整个问题可以构造成MILP混合整数线性规划或者MIQP混合整数二次规划。2.3 约束条件梳理约束条件决定了模型的物理可行性。我分五类说明1电功率平衡约束每个IES在任何时刻都要满足电力平衡风电出力 CHP发电 储能放电 上级电网购电 其他IES输入电功率 电负荷 电锅炉耗电 电制冷机耗电 储能充电 向其他IES输出的电功率。2热功率平衡约束CHP余热 燃气锅炉产热 电锅炉产热 热网输入热量 热负荷 吸收式制冷机耗热量 向其他IES输出的热量。3冷功率平衡约束吸收式制冷机供冷 电制冷机供冷 冷负荷。4设备运行约束主要是以下几类CHP机组出力上下限约束、爬坡约束、热电比耦合约束燃气锅炉/电锅炉出力上下限约束和爬坡约束储能系统充放电功率上限、SOC状态转移方程、充放电效率。5集群联络线约束各IES间的交换功率不能超过联络线容量上限。如果不用整数变量可能出现同一条线路同一时刻既有输入又有输出的情况这在物理上不合理。因此需要引入二进制变量确保功率交换方向唯一 $$ 0 \le P_{ij,t}^{ex} \le M \cdot u_{ij,t},\quad 0 \le P_{ji,t}^{ex} \le M \cdot (1-u_{ij,t}) $$ 其中 $u$ 是0-1变量表示功率流向。2.4 需求侧响应建模思路联合需求侧响应是本模型的一大亮点。我将它拆解为两部分2.4.1 价格型需求响应Price-based DR用分时电价引导用户改变用电时段。负荷模型采用价格弹性系数法用户对电价的响应程度用电价弹性矩阵来表示 $$ \Delta L_t L_t^0 \cdot \sum_{\tau} E_{t,\tau} \cdot \frac{\Delta P_{\tau}}{P_{\tau}^0} $$自弹性系数 $E_{t,t}$ 为负表示电价升高则本时段负荷下降交叉弹性系数 $E_{t,\tau}$ 为正表示其他时段电价升高用户会把这部分负荷转移到本时段。不过在复现时我没有做完整的弹性矩阵迭代而是直接用迁移系数法把DR后的电负荷表示为基础负荷与迁移量的叠加。2.4.2 替代型需求响应Substitution-based DR这是“联合”两个字的精髓。冷热负荷可以在不同能源之间替代热负荷可以由CHP余热、燃气锅炉燃烧天然气、电锅炉消耗电能三种方式提供冷负荷可以由吸收式制冷机消耗热能和电制冷机消耗电能提供。用户可以根据能源价格的变化调整自身用能结构。体现在模型里就是在热/冷负荷平衡约束中引入可变的电转热、气转热、热转冷系数让系统自动选择最经济的能源路径。替代型DR的约束可以表示为 $$ L_t^{heat,DR} L_t^{heat,base} - \Delta H_t^{EB} - \Delta H_t^{GB} \Delta H_t^{CHP} $$ 其中 $\Delta H$ 表示各设备承担的负荷转移量。这些量既影响设备出力又受到用户补偿成本的约束。2.5 为什么选择集中式优化而非分布式实现集群协同有两种路线一是集中式把所有IES的模型整合进一个大的优化问题中一次性求解二是分布式如ADMM各IES独立求解、通过迭代收敛到全局最优。本文复现采用集中式原因有三点集群规模不大3个IES集中式求解的计算量完全可控集中式一次求解得到的是全局最优解不需要处理收敛精度和罚参数调参问题代码结构更简单适合作为复现论文的基准模型。如果集群扩展到几十个甚至上百个IES集中式会因为变量规模急剧膨胀而出现“维数灾”那时候必须改用分布式求解。这个我在第5章拓展部分会细说。3. Matlab代码实现细节3.1 整体工程结构与运行流程拿到一篇论文要复现第一件事不是写代码而是搭工程目录。我是这样组织的IES_Cluster_DR/ ├── main.m % 主程序入口 ├── data/ │ ├── load_data.m % 生成/加载负荷数据 │ ├── price_data.m % 分时电价、天然气价格 │ ├── device_params.m % 设备参数配置 │ └── wind_data.m % 风电出力预测数据 ├── model/ │ ├── build_model.m % 构建优化模型Yalmip变量和约束 │ ├── objective.m % 目标函数 │ ├── constraints.m % 约束条件集合 │ ├── dr_model.m % 需求侧响应模型 │ └── cluster_model.m % 集群间交互约束 ├── solver/ │ └── solve_model.m % 调用求解器求解 ├── result/ │ └── plot_results.m % 结果可视化 └── utils/ ├── load_data_file.m % 读取数据文件 └── save_figure.m % 保存图片运行流程是main.m先加载所有数据 → 调用build_model.m创建决策变量和约束 →solve_model.m求解 →plot_results.m绘图输出。整个流程很线性定位问题很方便。3.2 决策变量设计决策变量是整个模型的数据基础。我使用Matlab的struct来管理变量避免变量名冲突和传递混乱% 决策变量定义Yalmip x struct(); x.P_wt sdpvar(3, T, full); % 风电出力实际上按预测值固定 x.P_chp sdpvar(3, T, full); % CHP电出力 x.H_chp sdpvar(3, T, full); % CHP热出力 x.H_gb sdpvar(3, T, full); % 燃气锅炉热出力 x.P_eb sdpvar(3, T, full); % 电锅炉电功率 x.H_eb sdpvar(3, T, full); % 电锅炉热功率 x.P_ec sdpvar(3, T, full); % 电制冷机电功率 x.C_ec sdpvar(3, T, full); % 电制冷机冷功率 x.H_ac sdpvar(3, T, full); % 吸收式制冷机耗热 x.C_ac sdpvar(3, T, full); % 吸收式制冷机冷功率 x.P_ess_c sdpvar(3, T, full); % 储能充电功率 x.P_ess_d sdpvar(3, T, full); % 储能放电功率 x.SOC sdpvar(3, T1, full); % 储能荷电状态 x.P_ex sdpvar(3, 3, T, full); % 集群间电功率交换3x3矩阵表示拓扑 x.u_ex binvar(3, 3, T, full); % 交换方向约束的二进制变量 x.DR_elec sdpvar(3, T, full); % 电负荷响应量 x.DR_heat sdpvar(3, T, full); % 热负荷响应量sdpvar函数是Yalmip定义决策变量的入口3, T表示三个系统、T个时段。这里的T是可配置的我默认设置为24小时以1小时为调度精度。3.3 约束条件代码实现约束条件用constraints结构体统一存储最后一次性拼装给Yalmip的optimize()函数调用。电功率平衡约束代码Constraints []; % 电功率平衡注意交换功率是有方向的 for k 1:3 for t 1:T % 本地发电 储能放电 外系统输入 本地负荷 储能充电 外系统输出 设备耗电 Constraints [Constraints, x.P_wt(k,t) x.P_chp(k,t) x.P_ess_d(k,t) sum(x.P_ex(:,k,t)) ... L_e(k,t) x.DR_elec(k,t) x.P_ess_c(k,t) ... x.P_eb(k,t) x.P_ec(k,t) sum(x.P_ex(k,:,t))]; end end注意这里sum(x.P_ex(:,k,t))是其他系统输入到本系统的功率sum(x.P_ex(k,:,t))是本系统输出到其他系统的功率。由于系统之间可能是双向交换必须在构建模型时就明确下标对应的关系否则平衡约束方向一错求解器跑出来的结果完全不符合物理常识。热功率平衡约束类似如果模型热网包含损耗则还需要在输出侧加入传输效率损耗系数我在默认模型中为了简化忽略热网损耗但在代码中预留了效率参数的位置方便后续扩展。储能SOC约束是另一个容易出现“维度不一致”的地方for k 1:3 % SOC初值 Constraints [Constraints, x.SOC(k,1) E_init(k)]; for t 1:T % 储能充放电状态互斥可选 % Constraints [Constraints, x.P_ess_c(k,t) x.P_ess_d(k,t) Ess_Pmax(k)]; % SOC更新 Constraints [Constraints, x.SOC(k,t1) x.SOC(k,t) ... (eta_c * x.P_ess_c(k,t) - x.P_ess_d(k,t) / eta_d) * dt]; % SOC上下限 Constraints [Constraints, SOC_min(k) x.SOC(k,t1) SOC_max(k)]; end % 周期约束可选末端SOC回到初值 % Constraints [Constraints, x.SOC(k,T1) E_init(k)]; end对于24小时调度通常不强制末端SOC回到初值而是设定一个宽松范围让优化器有足够的灵活性安排储能。如果生产场景要求天天循环那可以加入往返周期约束但代价是可行域变小目标函数值可能略差。3.4 目标函数和求解器配置目标函数代码% 目标函数运行成本最小化 Cost 0; for t 1:T % 购电成本分时电价 Cost Cost Price_grid(t) * P_grid(t); % 购气成本 Cost Cost Price_gas * (F_chp(t) F_gb(t)); % 运维成本简化为线性函数 Cost Cost k_om * (P_chp(t) H_chp(t) H_gb(t) P_eb(t) P_ec(t)); % DR补偿成本 Cost Cost lambda_dr * (DR_elec(t) DR_heat(t)); end % 求解 options sdpsettings(solver, gurobi, verbose, 1, showprogress, 1); result optimize(Constraints, Cost, options);这里有个经验刚开始调试时verbose设为1能清楚看到求解器报错还是正常终止。如果模型规模大、约束复杂建议先设置一个较短的TimeLimit比如60秒来观察目标函数是否在快速下降判断模型是否存在冗余约束。对于3个系统24小时的MILP通常求解时间在几秒到几十秒之间问题不大。4. 复现过程中踩过的坑与排查技巧4.1 环境配置的坑Yalmip、求解器的安装与破解陷阱首先是Yalmip的安装。Yalmip是一个Matlab工具箱从GitHub下载后在Matlab中addpath(genpath(yalmip文件夹路径))然后保存即可。但要注意版本兼容性新版本Yalmip对老版本的某些函数接口有可能不兼容如果报“Undefined function”大概率是路径或版本问题。求解器的选择也直接影响结果。Gurobi和CPLEX是商业求解器对于MILP性能远优于开源求解器。但Gurobi需要license学术license申请需要通过学校邮箱注册如果在校学生建议尽早申请个人邮箱无法申请学术版。如果暂时没有求解器也可以用Yalmip自带的sedumi或intlinprogMatlab内置但求解效率会有明显下降。我的实测经验是同样的MILP问题Gurobi用5秒intlinprog可能需要30秒以上且大数据场景下差距还会扩大。4.2 维度不匹配与变量索引错误Yalmip的一个常见坑是sdpvar(n1, n2)与sdpvar(n1, 1)做运算时Matlab的隐式扩展机制会给出错误而不会报错。比如x sdpvar(3, 24, full); y sdpvar(3, 1, full); Constraints [x y 0];这个约束会报维度错误因为x是3x24矩阵y是3x1向量。但如果Yalmip和Matlab版本比较新它会自动broadcast结果就是每一列都加同一个向量这种隐式行为很容易导致模型和预期不一致。我的建议是所有决策变量在定义时就统一维度涉及单时段参数循环赋值时千万不要在循环外直接用x(k, t)索引而是要确保索引存在。另一个高频的维度错误出现在矩阵乘法和逐项乘法的混淆上。Yalmip里*是矩阵乘法.*是逐项乘法。很多复现代码里如果强行用*来计算两个同维度变量结果会变成一个标量或矩阵乘法的结果模型就完全错了。检查这种错误的方法是直接查看Yalmip表达式的sizesize(expression)如果和你预期不一致多半是乘法运算写错了。4.3 结果不合理时怎么快速定位我跑完第一版代码后发现热功率平衡曲线在部分时段出现明显的低谷并且热负荷未完全满足。排查后发现是需求侧响应模型中热负荷替换量的正负号方向出了问题——需求响应应该是对基础负荷进行调整调整幅度有上下限但如果代码里把L_heat_after_DR L_heat_base - DR_heat写成了就会扩大热负荷而非削减热负荷导致热源出力不足。定位这种问题最好用的方法就是“约束检验法”把求解结果代入每一个平衡约束看左右两侧的残差是多少。如果残差接近0那约束本身满足问题出在目标函数或参数上如果残差很大那约束实现有问题。我在代码里额外写了一个check_feasibility.m函数把所有平衡约束的残差输出到命令行排查效率至少提升三倍。我自己复盘时发现做这种复现工作最忌讳的是一上来就盯着代码看。一定要先明确“物理上什么是合理的”比如热负荷深夜峰值、白天低谷风电出力凌晨高、白天低这些都是常识性判断。如果仿真的曲线违反这些规律不用怀疑代码基本有bug。先把大方向调对再去微调参数。4.4 复现EI论文的通用经验论文数据缺失怎么办绝大多数EI论文不会把所有参数都完整列出来这个很正常。复现时不要死磕某个具体的参数值而是要通过方法复现验证论文提出的模型和算法是否可行。具体处理策略论文里给了表格的直接用表格数值没给表格但给了图用坐标纸上的近似值推荐用WebPlotDigitizer这类工具从图上提取数据没给图的参考同类论文的常识范围比如CHP热电比在1.0~1.5之间储能效率在0.9左右。数据不同导致结果和论文对不上是正常的。重要的是验证模型结构和求解思路是否正确。我自己复现的时候最关注的是每个模型变化导致结果变化的趋势是否和论文一致比如“加了DR之后购电费用下降、天然气费用略有上升、总成本下降”这类结论而不是盯着具体数值要求完全一致。另一个经验如果论文里没有给出完整的系统拓扑默认取3个节点、24小时周期的配置通常不会错。这种配置能有效测试模型又不会因为复杂度太高导致问题不可解。跑通之后再扩展到大型系统。5. 从复现到扩展这个模型还能怎么玩5.1 不确定性建模风电出力的偏差本文复现的模型是确定性的预测曲线是多少就按多少优化。但实际运行中风电预测偏差是常态。要扩展的话可以在风电出力约束中加入不确定性集合采用鲁棒优化的方法构造“盒式不确定集合”或者“椭球不确定集合”让调度结果在风电出力波动时仍然可行。这个扩展在Yalmip中也能实现只是需要引入辅助变量。5.2 分布式求解ADMM与多代理集群规模大幅扩展时集中式求解会遇到性能瓶颈我前面提过。到时可以考虑用ADMM交替方向乘子法把集群层面的耦合约束分解到各IES的本地子问题中去各系统独立迭代、交换边界功率信息最终收敛到全局最优。Matlab里实现ADMM并不复杂核心思路就是循环更新各子问题的变量和罚参数直到原始残差和对偶残差满足收敛精度。这个方向适合做研究的同学延伸。5.3 从学术到落地园区级综合能源系统如果把这套模型从论文搬到实际工程最直接的应用场景是园区级综合能源系统——比如一个科技园区、一个产业新区包含光伏、储能、三联供机组、电锅炉、冰蓄冷以及多家企业用户。模型里的“IES集群”对应到物理世界就是多个单体建筑或者多个能源站联络线变成真实的电力管廊和供热管道。这时候需求侧响应就更接地气——说的是“邀约响应”“虚拟电厂”“空调负荷聚合”这些实际运行中真实存在的概念。模型可以用于短期日前调度为运行人员提供各设备的出力计划。不过实际工程中还需要考虑电力市场的实时价格信号、用户响应意愿的不确定性、通信可靠性等问题这些在科研模型里通常被简化。如果真想落地建议在模型基础上加入更细粒度的用户行为建模和互动机制而不是只做单次优化。5.4 与碳交易、绿电交易结合最近双碳目标推动下碳交易市场逐步完善绿电交易也日益规范。这个模型可以很方便地加入碳排放约束或碳交易成本项目标函数中增加碳配额购买成本或者在约束中限定碳排放上限。这样优化结果就能同时反映经济性和低碳性。我已经在这个方向试过效果不错在碳价较高时系统会自发增加可再生能源消纳、减少天然气机组的出力。这个扩展方向适合正在做碳电耦合方向的同学参考。6. 复现中的重要注意事项与实用心得6.1 仿真时间的设定本文默认采用24小时优化周期1小时粒度共24个时段。这个时间粒度适合日前调度场景。如果做日内滚动优化建议粒度缩到15分钟也就是96个时段这时变量数量增加到原来的4倍求解时间可能会显著变长需要做好求解时间预算控制。分时电价数据是需求侧响应的核心输入。一般按照工业峰谷电价的典型曲线设定峰时段10:00-15:0018:00-21:001.2元/kWh平时段07:00-10:0015:00-18:0021:00-23:000.7元/kWh谷时段23:00-07:000.35元/kWh天然气价格我取2.5元/m³折算为热值再考虑CHP发电效率40%可以算出每度电的气成本在0.5-0.7元左右只有当电价高于这个值时燃气机组才值得满发。6.2 Yalmip代码风格建议代码风格直接影响调试效率。我强烈建议使用结构体数组来管理变量并为每个变量写明确注释。不要写“x1”“x2”这种名字跑过一个月再看代码自己都看不懂。其次约束条件建议用多条约束语句拼接而不是全部放在一行否则报错时很难定位具体哪条约束出错。% 低耦合的约束写法 Constraints []; Constraints [Constraints, x.P_eb 0]; % 电锅炉出力下限 Constraints [Constraints, x.P_eb Eb_Pmax(k)]; % 电锅炉出力上限这种逐条写的风格在模型规模大时代码行数会比较多但可读性、可维护性强值得推荐。6.3 结果验证的最重要一步在正式跑大规模场景之前我强烈建议先跑一个“最小测试”或者“退化测试”把所有IES配置成完全一样的参数关闭DR关闭集群功率交换。此时模型理论上等价于三个独立系统并行优化。如果这个基准测试得到的结果每个IES的目标函数值完全相等说明模型是自洽的。然后再逐步打开DR、打开集群交换观察哪些结果发生变化这样能快速定位模型中哪个模块引入了错误。同样可以测试极端场景比如把风电出力设为0看系统是否还能保持功率平衡把电价设为恒定值看DR是否失效。这些都是模型可靠性的边界测试。说回复现这篇论文本身我最深的一点体会是复现EI论文的收获不只在“跑通代码”那一刻。真正有价值的是你在过程中反复纠结“为什么这里要这样建模”“为什么这个约束写成了不等式”的那些瞬间。等你把每一个变量、每一条约束都理解透彻再去改写、扩展、应用到自己的课题里其实已经水到渠成。最后再分享一个小技巧做这种复现任务数据文件最好统一用.mat格式保存不要用Excel。Matlab读取Excel需要额外工具箱支持而且速度慢、格式容易出错。.mat格式天生和Matlab无缝衔接数据加载只需一秒。把数据管理好后续换算、大规模求解、结果对比都能省下不少时间。