资讯动态

综合能源系统优化调度入门:Matlab+Gurobi求解框架与文献利用

发布时间:2026/10/20 7:03:58 来源:尧图企业网站定制
如果你正在接触综合能源系统优化调度手边已经堆了几十篇参考文献又打算用Matlab和Gurobi求解一套调度模型那我猜你现在的心情和我刚开始进入这个方向时一模一样文献看得越久越心虚总觉得所有论文都在用我没见过的数学工具而我连第一步代码都不知道怎么写。后来被A同学一句话点醒——不是复现文献仅供参考。这句话成了我整个学习路径的转折点。这篇博文不是要带你去复现哪篇论文而是给你一套从问题拆解、工具选型、框架搭建到文献利用的完整思路。内容围绕三个关键词展开综合能源系统优化调度参考文献Matlab/Gurobi求解。适合两类人一是刚起步的研究生二是接到类似任务但缺少工程套路的工程师。阅读之后你能独立搭出一个最小可运行的调度模型并且知道怎么用文献撑起自己的建模结构而不是被文献牵着走。1. 先把这个优化问题拆到不能再拆1.1 综合能源系统里到底在调什么度综合能源系统的综合指的是不只停留在电力系统里看问题而是把电、热、气、冷等多种能量形式放在一张拓扑图里统一调配。典型设备包括冷热电联产机组CHP、燃气锅炉、电锅炉、热泵、光伏、风电、蓄电池、储热罐以及可能出现的电转气、燃气轮机等。这些设备被电母线、热母线、气母线连接起来彼此通过耦合设备产生强关联。比如CHP烧天然气同时发电和产热燃气锅炉则直接产生热功率电锅炉把电能转化为热能。只要有一个负荷发生变化所有设备的出力计划几乎都要跟着重新排。调度优化的度就是给所有可控设备安排未来若干小时内的出力计划。通常做的是日前调度假设负荷、新能源出力可以从预测曲线取到然后把系统运行安排成一组数学决策变量包括购电量、机组启停状态、机组出力、储能充放电功率、热网供热量等等。调度周期一般是24小时时间颗粒度可以是1小时也可以是15分钟。颗粒度越小变量数和约束数会成倍增加但建模逻辑完全一样。对初学者来说最容易犯的错是一上来就追求大而全的系统图。电、热、气、冷、交通、建筑全塞进一个模型结果连约束都写不齐。我的建议是把系统拆成源—网—荷—储四层再按能量形式拆分。先画一张能量流草图哪些设备接在电母线上哪些设备接在热母线上两条母线之间靠什么设备连接。这个过程不需要任何数学只需要把拓扑看明白后面列公式时就不会漏变量。1.2 目标函数和约束的常见形态综合能源系统优化调度在数学上本质上是一个带约束的优化问题。目标函数通常是最小化运行成本包括向上级电网购电的费用、天然气购买费用、启停费用、设备维护费用以及可能的碳排放成本。有些研究还会把系统运行成本和新能源消纳量写成一个多目标函数但工程上常用的做法是通过碳价或惩罚系数把二氧化碳排放折算成成本项加进目标函数这样仍然等价于单目标最小化Gurobi可以直接处理。约束条件的形式比较固定主要包含四类能量平衡约束、设备出力范围约束、储能设备的时间耦合约束、系统安全或备用约束。能量平衡约束是等式约束比如任意时刻电负荷加上电锅炉消耗必须等于上级电网购电、光伏出力、CHP电出力以及蓄电池放电之和。设备出力范围约束是不等式约束比如燃气锅炉的出力不能超过额定容量。储能约束则把前后两个时段的状态用递推公式连在一起形成全时段的耦合。这套模型最常见的数学形态是混合整数线性规划MILP。整数变量来自机组启停、储能充放电互斥这些要么开要么关的逻辑。为什么MILP在综合能源调度里这么流行因为Gurobi这类商用求解器对MILP的求解速度已经非常成熟而且线性约束比非线性约束容易诊断问题。设备效率曲线如果是非线性的可以用分段线性化近似交流潮流太复杂日前调度通常用直流潮流或线性化潮流热网动态特性则用热功率平衡乃至二阶锥松弛处理。这些技巧的核心思路是一致的把问题尽量压成线性或混合整数线性用成熟求解器解决而不是和优化算法死磕。1.3 一个最小可算算例为了不让人觉得空谈先定一个明确的参照系后面代码都用它。假设有一个某园区典型日系统上级电网购电入口、CHP机组、燃气锅炉、电锅炉、光伏、蓄电池外加电负荷和热负荷。调度周期24小时步长1小时。决策变量包括每个小时的上级购电功率、CHP电出力和热出力、CHP启停状态、燃气锅炉热出力、电锅炉电功率和热功率、蓄电池充放电功率和充电/放电状态。数学表达上电平衡约束写成P_buy(t) P_pv(t) P_chp_e(t) P_bat_dis(t) P_e_load(t) P_eb(t) P_bat_char(t)热平衡约束写成Q_chp(t) Q_gb(t) Q_eb(t) Q_heat_load(t)储能约束则是SOC(t1) SOC(t) eta_char · P_bat_char(t) · Δt / Cap - P_bat_dis(t) · Δt / (eta_dis · Cap)在这个简化算例里变量数量大约为连续变量7个/时段二进制变量3个/时段约束约6组/时段。对Gurobi来说这种规模的MILP基本是闭着眼睛就能解的但我仍然建议你先从这么小的模型开始跑通全流程因为调试方便每一条结果都可以手算检查。等这套最小系统跑通了再逐步加储热、热网管道、多台机组、碳排放约束、滚动优化错误才能控制在能查的范围里。2. 为什么是MatlabGurobi而不是其他组合2.1 求解器与建模平台的分工很多第一次接触优化调度的朋友会困惑Matlab不是本身就能算优化吗为什么还要一个Gurobi这两者的关系需要先说清楚。Matlab是一个数值计算和编程平台它负责的是数据管理、模型搭建、结果后处理这些外圈工作真正在数学意义上把整数变量和线性约束暴力求解的是求解器这个内核。Matlab自带的intlinprog就是一个小型求解器能解MILPGurobi则是一款高性能商用数学优化求解器对线性规划、混合整数规划、二次规划和混合整数二次规划都有极快的求解速度。在综合能源优化调度这个场景里问题规模通常会达到数千到数十万个变量约束里包含大量时间耦合和逻辑关系。Matlab自带求解器不是不能用只是到了大规模或者复杂约束的时候求解速度会明显拉胯而且诊断信息没有Gurobi那么丰富。Gurobi提供多种调用方式可以直接通过Matlab的MEX接口把模型写成结构体传给gurobi函数也可以通过YALMIP这个建模工具箱来做中间层。YALMIP的好处是语法接近自然语言你只需要用sdpvar定义变量、用矩阵形式写约束它会自动转换成求解器需要的标准形式。这里顺便说一句如果你项目里已经有别人用过的Matlab代码大概率也是YALMIPGurobi的搭配。这是因为科研阶段需要反复修改目标函数、增加约束、对比场景YALMIP的符号建模方式能大幅降低修改成本。直接构造Gurobi的model结构体虽然运行效率更高但每一处改动都要手动调整矩阵维护体验很差。2.2 几种常见建模方案的取舍我见过不少项目组会在技术选型上纠结这里把常见组合的利弊直接列出来方便你做判断。组合方式优点缺点适合场景Matlab intlinprog免额外授权安装即用大规模问题慢复杂逻辑难表达调参空间小学习验证、极小型算例Matlab YALMIP Gurobi建模灵活求解速度快诊断信息丰富需要申请Gurobi授权需要学YALMIP语法科研原型、毕设、课题探索Python Pyomo Gurobi文本建模便于版本控制社区资源多Python与既有Matlab代码衔接麻烦需要工程化部署、团队已有Python功底Julia JuMP Gurobi建模语法现代性能优秀生态相对年轻团队上手有门槛新团队从零起步、长期学术研究选型逻辑可以和自己的实际处境挂钩。假如你是在某课题组里做综合能源调度研究大概率周围人的代码都是用Matlab写的沿用YALMIP能让你快速接入团队历史代码少走很多弯路。假如你目标是把调度系统做成一个长期运行的生产工具且涉及Web、数据库则Python方案更合适。我个人的倾向是科研原型阶段优先MatlabYALMIPGurobi因为改起来最快到了要做在线运行或日频繁调度的成品时再考虑把模型迁到Python接口。还有个过渡技巧如果暂时申请不到Gurobi授权完全可以用YALMIPintlinprog先把模型逻辑跑通。反正YALMIP的约束定义方式不变只要最后一行把求解器参数从intlinprog换成gurobi就能切换不需要重写模型。这样能让你先专心做建模不被求解器绑死。2.3 授权和部署的现实判断Gurobi是商用软件但针对学术科研有免费授权在校学生和老师可以申请。个人做毕设、课题组做研究用学术授权完全合规。企业项目就要走商业授权这个成本一万年逃不掉。我的看法是不要因为费用问题绕开Gurobi也不要觉得没有Gurobi就做不了课题。调度模型里最难的不是求解而是建模与数据处理求解器只是把最后那段数学计算交给专业引擎。关于部署也要想清楚综合能源优化调度通常做的是离线日前调度每天根据第二天的负荷预测曲线跑一次模型输出各设备出力计划。这种场景对实时性要求不高哪怕求解器跑几分钟也完全能接受。如果是日内滚动优化或实时EMS则要求每次求解在几十秒甚至几秒内完成这时需要精简模型、设定合理的MIPGap甚至把部分逻辑用线性规划直接表达避免整数爆炸。Gurobi在这些用法里都能胜任只是要分清楚你是哪种业务场景。3. 从零搭一套调度求解框架的具体路径3.1 数据准备把系统拓扑变成表格很多人的建模代码写不好问题出在数据上没有章法。我的经验是先把所有参数整理成结构体或表格再写模型。下面给出一套典型的参数表单位统一用kW表示功率、kWh表示电量、元/kWh表示电价天然气成本用元/立方米、再按热值折算成元/kWh。参数数值说明Pchp_max / Pchp_min800 / 150 kWCHP电出力上下限Qchp_max / Qchp_min900 / 80 kWCHP热出力上下限Qgb_max1000 kW燃气锅炉最大热出力Peb_max500 kW电锅炉最大电功率eta_eb0.95电锅炉电转热效率Bat_cap1000 kWh蓄电池容量Pb_char_max / Pb_dis_max300 / 300 kW电池最大充放电功率eta_char / eta_dis0.95 / 0.9充放电效率price_buy分时数组典型日购电价格price_gas3.2 元/立方米天然气单价LHV_gas9.7 kWh/立方米天然气低位热值负荷和光伏曲线以数组形式放进Matlab工作区24维向量Peload、Qload、Ppv。先用确定性数据不要一上来就做不确定优化。把参数定义在脚本开头后面建模部分只写变量和约束这样以后换数据只需要改这一段。3.2 YALMIP建模变量、约束、目标下面这段代码是我常用的建模骨架变量名称相对直观方便你把它改成自己的系统。注意这是简化模型CHP的燃料成本没有采用完整的热耗曲线而是用固定电效率和固定热效率近似正式项目建议用分段线性热耗曲线。T 24; dt 1; % ---- 参数模块从结构体读取 ---- p system_params; % ---- 决策变量 ---- p_buy sdpvar(T,1); p_chp sdpvar(T,1); q_chp sdpvar(T,1); z_chp binvar(T,1); % CHP启停状态 q_gb sdpvar(T,1); p_eb sdpvar(T,1); q_eb sdpvar(T,1); p_char sdpvar(T,1); p_dis sdpvar(T,1); u_char binvar(T,1); u_dis binvar(T,1); soc sdpvar(T1,1); % 蓄电池SOC含初始时刻 % ---- 约束集合 ---- C []; % 上下限约束 C [C, 0 p_buy p.Pbuy_max]; C [C, p.Pchp_min .* z_chp p_chp p.Pchp_max .* z_chp]; C [C, p.Qchp_min .* z_chp q_chp p.Qchp_max .* z_chp]; C [C, 0 q_gb p.Qgb_max]; C [C, 0 p_eb p.Peb_max]; q_eb p.eta_eb * p_eb; % 电锅炉出力转换 C [C, 0 p_char p.Pb_char_max .* u_char]; C [C, 0 p_dis p.Pb_dis_max .* u_dis]; C [C, u_char u_dis 1]; % 充放电互斥 % 储能SOC递推 C [C, soc(1) p.SOC_init]; C [C, soc(2:T1) soc(1:T) ... p.eta_char .* p_char / p.Bat_cap - ... p_dis ./ p.eta_dis / p.Bat_cap]; C [C, 0.2 soc 0.9]; % 避免过充过放 % 逐时段平衡 for t 1:T % 电平衡 C [C, p_buy(t) p_pv(t) p_chp(t) p_dis(t) ... p_load(t) p_eb(t) p_char(t)]; % 热平衡 C [C, q_chp(t) q_gb(t) q_eb(t) q_load(t)]; end % ---- 目标函数最小化购电购气成本 ---- c_gas_per_kwh p.price_gas / p.LHV_gas; Objective sum(price_buy .* p_buy) ... c_gas_per_kwh * sum(p_chp / p.eta_e_chp q_chp / p.eta_h_chp) ... c_gas_per_kwh * sum(q_gb / p.eta_gb) ... sum(p.price_penalty .* max(0, p_load - (p_buy p_pv p_chp p_dis)));关于CHP燃料成本这里把天然气成本近似为热耗除以效率计算量直观但要注意它没有考虑CHP的启停燃料消耗。工程上更严谨的做法是用厂商提供的热耗曲线做分段线性化再写进目标函数这一点在后续扩展时一定不能省。3.3 求解与结果后处理模型写完后求解器调用非常简捷。我个人习惯在ops里明确设置求解器和MIPGap避免默认参数导致在某个局部最优里浪费大量时间ops sdpsettings(solver,gurobi,verbose,2, ... gurobi.mipgap,1e-3, ... gurobi.timelimit,600); sol optimize(C, Objective, ops); if sol.problem 0 disp(求解成功); else disp(求解失败问题状态:); sol.info end p_buy_opt value(p_buy); p_chp_opt value(p_chp); q_chp_opt value(q_chp); q_gb_opt value(q_gb); p_eb_opt value(p_eb); soc_opt value(soc);后处理部分最少要输出两类东西一是电平衡和热平衡的逐时曲线用来确认没有把平衡约束写错二是总成本和各项费用的拆分。你可以用Matlab的plot函数把负荷曲线和设备出力画在同一张图上用堆叠柱状图看电功率构成。不要小看这一步大部分模型错误都是先在后处理图里暴露出来的而不是在约束求解时暴露。此外非常推荐把基础版本封装成函数。输入参数是负荷曲线、光伏曲线和价格曲线输出是调度计划和成本。以后做多场景对比只需要写个循环调用这个函数不用每次复制粘贴大量代码。这个习惯能让你把精力放在方案分析上而不是反复调试脚本。4. 文献的正确用法参考结构而不是复现代码4.1 读文献的四个层次标题里那句话不是复现文献仅供参考很多人可能不理解写论文不看论文那看什么我的理解是文献提供的是知识地图而不是施工图。你要学会的是别人的建模思路、变量构造方式、约束处理技巧但要复用的方向是自己能不能用同样的结构解决自己的问题。读文献可以分成四个层次。第一层是扫读只看摘要和结论确认这篇论文处理的是日前调度、日内滚动还是实时控制用的是单目标还是多目标系统里包含哪些设备。这一层的目的是快速判断哪些论文值得精读。第二层是精读重点放在模型部分把目标函数包含哪些项、决策变量有哪些、约束条件分成几组逐一抄到自己的笔记里。第三层是对比把几篇相似论文放在一起看他们对同一个设备比如CHP的建模方式有什么区别有人用可行域包络约束有人用线性化热耗曲线有人直接忽略启停这种差异恰恰是你可以做改进文章的地方。第四层是评估可复现性如果论文里给了完整参数和公开代码那是极好的参考如果没有也不可惜因为你要的是结构。我在入门阶段最容易犯的错误是试图抄一篇论文的完整模型把几十个公式一字不差搬过来。结果发现参数对不上、变量名混乱、边界条件缺失反而花了两星期都没法运行。后来改成以结构提取为主每篇论文只提炼三样东西目标函数的构成项、关键约束的处理方式、求解工具和线性化方法。这样每篇文献都能低成本变成自己模型库里的一个候选模块。4.2 怎么把一篇论文翻译成变量和约束建议给每篇关键文献建一张卡片字段固定下来。我自己用的是下面这个模板。字段记录内容示例文献标识第一作者年份主题Zhang2023_CHP调度目标函数列出了哪些成本项购电购气启停碳排放决策变量连续/整数变量有哪些机组出力、启停状态、储能关键约束设备建模、平衡约束、逻辑约束CHP四边形可行域、储能SOC递推求解方法用什么求解器和什么松弛Gurobi、分段线性化算例数据负荷曲线来自哪规模多大典型日24点某园区假设数据可复现性是否给代码/参数复现难度无代码参数部分缺失中这张卡片的用途是让你在写自己模型时可以快速横向查找比如今天需要一个电锅炉模型把卡片库里所有涉及电锅炉的段落调出来对比明天想加入碳交易机制就把目标函数相关的卡片翻出来。这个过程类似维护一套自己的组件库而不是反复翻原文。把论文翻译成自己代码时原则是统一变量名。文献里的符号经常混乱但你的模型必须统一。比如CHP电出力固定用p_chp热出力固定用q_chp这个命名在每篇相关文献里都保持一致。这样当你想尝试论文A的热网模型时只需把对应约束块插入你的代码变量名不会撞车。我的经验是大部分复现失败都来源于变量名不一致和索引错位而不是数学本身有多难。4.3 遇到复现不了怎么办不公开代码、参数缺失、算例数据不明确这在综合能源领域的文献里非常常见没有必要因为这个而对论文失去信任。正确做法是借结构不借数据。你只借鉴设备的建模关系数据用自己假设的或公开测试系统的再手动验证合理性。举个具体例子某篇论文用四边形的CHP可行域描述电出力与热出力的耦合关系但没给具体的四个顶点坐标。你完全可以用一个简化的矩形可行域先搭模型只要系统整体能跑通再查阅其他文献补全四边形顶点参数对比两种建模方式对调度结果的影响。这个过程本身就是一种研究贡献因为它说明了你对设备模型的选择敏感度有所掌握而不是只会照搬公式。判断一个复现是否成功的标准应该看数值规律是否一致而不是绝对数值相同。例如某文献指出增大碳价时系统会降低燃气锅炉出力、把更多热量转给电锅炉这个变化趋势如果你的模型也能复现出来那核心机制就抓到手里了。具体成本数字不同很正常因为负荷曲线、价格、效率参数都不一样。要时刻记住你不是在考证某篇论文的代码而是在建立你自己对系统的理解。这个心态能让你少掉很多头发。5. 求解环节真正容易翻车的几个地方5.1 不可行问题先查边界再查平衡第一次调模型Gurobi很可能直接告诉你infeasible。这时候不要慌也不要立刻去搜代码。不可行意味着你的约束条件把可行域压缩成了空集问题一定在约束之间矛盾或者变量边界设置不合理。我的排查步骤很有顺序感。第一步检查变量上下限把每个设备的出力上限相加看能否覆盖该时段的负荷。比如一天中最大的热负荷是1200kW而CHP热出力上限800kW、燃气锅炉上限1000kW合计上限1800kW这个还没问题但如果热负荷峰值是2200kW那数学上必然无解。第二步检查平衡约束是否把方向写反了这个错误几乎每个人都会遇到比如把电锅炉消耗写成了发电。第三步检查储能约束的初始值和SOC上下限如果初始SOC很高而最低SOC限制也很高叠加放电效率后可能没有足够电量满足负荷。第四步用YALMIP的check函数检查约束残差。residuals check(C); [val, idx] min(residuals); C(idx)残差为负且绝对值较大的约束就是最可疑的约束。把那条约束注释掉再求解一次如果模型变可行问题基本就能锁定。还有一个小技巧先开放所有惩罚项允许少量功率不平衡代价是加惩罚系数这样模型至少不会直接不可行再看是哪几个时段在偷偷破坏平衡诊断效率会高很多。5.2 大M法的数值地雷与逻辑约束写综合能源调度模型时设备启停和出力范围经常需要机组不运行时出力必须为0这样的逻辑。最常见的写法是用一个很大的Mp_chp(t) Pmax * z_chp(t) p_chp(t) Pmin * z_chp(t)这个写法本身没有错但如果M选得不好后患无穷。M太大Gurobi会遭遇数值病态有时输出一个看似最优但实际上是违反约束的结果M太小又会无意中切掉可行域。解决方式有两个一是尽量用设备实际物理上限作为M而不是随便取100000二是直接用YALMIP的逻辑约束函数implies让求解器内部处理这种约束关系。C [C, implies(z_chp, p_chp p.Pchp_min)]; C [C, implies(z_chp, p_chp p.Pchp_max)];同样的逻辑也适用于储能充放电互斥。我这里会明确加一条u_char u_dis 1防止模型同时充电和放电以窃取能量。这个约束看似多此一举但如果没有它目标函数在电价差大的时候模型真的会造出一边充电一边放电的奇怪结果因为非线性效率关系可以从中获利。互斥约束是储能模型的必备项。5.3 Gurobi调参先看gap再谈最优很多人跑Gurobi之后只看最后的exitflag完全忽略求解过程中的MIP gap信息。MIP gap表示当前找到的最好整数解与线性规划松弛下界之间的相对差距gap越小说明解的质量越高。工程调度不一定非要gap0很多时候gap收敛到0.1%就已经可以接受。下面这几个参数是我实测下来最常用的。参数推荐值说明MIPGap1e-3 或 1e-4相对最优间隙越小越慢TimeLimit300~3600秒防止跑一夜不出结果Threads默认或设为4~8多核提速但收益不是线性的Presolve默认1模型压缩一般不要关NumericFocus1或2出现数值警告时再调求解中观察输出窗口里的Incumbent和Best Bound两项Incumbent是当前找到的最好可行解目标值Best Bound是所有可能解的理论下界。如果两者靠得足够近说明搜索空间已经基本穷尽再等下去只是浪费时间。我通常会把这个判断写进代码用sdpsettings设定gurobi.mipgap让求解器自己决定何时停止而不是傻等默认最优。范经验第一次求解先设一个宽松的gap比如1%看看模型跑通没有、结果是否符合物理规律确认无误后再把gap收紧到0.1%。这样做能快速发现模型错误而不必为每个错误等待半小时求解。5.4 热网模型先热功率平衡再谈动态特性综合能源调度里热网往往是让模型从线性沦落为非线性的重灾区。热网管道的时间延迟、温度沿程变化、流量分配都会引入双线性项甚至偏微分方程。很多初学者看到文献里动辄数十页的热网动态建模直接被劝退。其实要不要做动态热网取决于研究目标。如果课题是做综合能源系统经济调度和设备规划采用热功率平衡模型往往已经足够只有专门研究热网管道蓄热特性、供需时间解耦时才需要细致的热网动态方程。我整理的取舍表格如下热网模型复杂度适用场景求解难度热功率平衡最低经济调度、设备选型线性非常容易节点法/稳态温度中等中长距离热网、多热源非线性需定温度边界动态热网二阶锥松弛高研究管道蓄热、日前调节凸优化但建模繁琐完整动态热网偏微分离散很高学术前沿或大型工程求解压力大慎选保守建议是第一步先做热功率平衡甚至把热负荷直接硬约束到平衡上第二步等模型完全跑通、稳定性没问题后再加一个简单的储热罐。储热罐的时间耦合逻辑和蓄电池很像难度不大收益却很大它能充分体现综合能源系统中储热的价值。如果之后必须做动态热网也优先用二阶锥松弛转化而不是自己写一个非线性求解器。6. 落地到项目里的三个个人习惯代码写多了之后你会发现项目成功与否往往不取决于某一两次求解而取决于习惯。第一个习惯是永远把模型拆成数据层、模型层、求解层、后处理层四部分。数据层集中在脚本开头模型层只读参数求解层只做参数传递后处理层只做结果分析和绘图。这样你换一套负荷曲线、改一个价格参数完全不需要碰模型层想换求解器也只需要改求解层的一行。第二个习惯是维护文献卡片库。我每读一篇关键文献至少抽出半小时把模型结构、数据处理方式、可复现性记录到表格里。这个卡片库在写论文时价值最大因为你不用重新翻阅几十篇PDF直接检索卡片就能找到所有相关约束的例子。第三个习惯是给每次求解设定时间和gap阈值绝不无限制地等完美最优。综合能源系统调度的本质是决策支持不是数学竞赛一个g ap1%、耗时30秒的解往往比gap0.01%、耗时2小时的解更符合工程需要。说到底MatlabGurobi和参考文献都只是你的工具。工具再强也替代不了你对系统结构和工程语义的理解。把问题拆清楚、把结构提出来、把参数管好、把文献当参考资料而不是施工图纸这条路走下来综合能源系统优化调度并没有想象中那么高不可攀。希望这篇分享能帮你把第一步迈得稳一点少走我当时走过的那段弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑