1. 项目是做什么的为什么这个题目值得做1.1 从实际调度场景说起做微电网调度的同学应该都遇到过这种场景手里有光伏板、有风机、有一套电池储能还能跟大电网交互买电现在要安排未来24个小时怎么发、怎么存、怎么买才能让负荷用得上、系统稳得住、成本压得低。这就是典型的微电网日前经济调度问题。“日前”这个词意味着时间尺度比日内滚动和实时控制要更靠前。实际工程中的做法通常是提前一天做次日计划比如下午完成申报晚上出结果第二天按计划执行。时间分辨率一般取1小时一天24个时段偶尔也会用15分钟一个时段做更精细的调度。这个项目把“风光储能”和“需求响应”放在同一个优化框架里核心要回答三个问题可再生能源出力该怎么消纳储能什么时间充、什么时间放负荷侧该在哪些时段削减多少电量才能让系统运行总成本最低。我之前带过几个毕业设计发现很多同学一上来就套用网上找的模型代码结果改完数据之后要么跑不出结果要么结果跟直觉完全对不上。所以我更建议先把问题本身拆透再动手写代码。这个题目恰好是微电网优化调度里最经典的入门组合把电源侧、储能侧、负荷侧三个维度的建模都覆盖了做完之后再看复杂系统会轻松很多。1.2 风光储和需求响应在模型里各扮演什么角色风电和光伏属于出力不可控的分布式电源在模型里它们不是决策变量而是预测输入。风机晚上出力通常比较稳光伏只有白天有中午前后达到峰值。两者叠加之后最大的问题就是“看天吃饭”负荷高峰时未必风大太阳足光伏最猛的中午又往往不是用电最紧张的时候供需在时间上天然错配。储能就是用来缓解这个错配的。它的作用很直白电力富余时充电电力紧张时放电。但储能也有自己的脾气比如充放电效率不是100%SOC有上下限不能既充又放容量也有限。这些约束必须在模型里明确写出来否则优化结果落地之后根本执行不了。需求响应则是从负荷侧找灵活性。说白了就是把一部分不那么着急用的电挪到别的时段去或者干脆在高峰时段少用一点换一笔补偿。这样做有两个好处一是降低微电网从主网购电的峰值压力二是减少对储能容量的依赖。还有一个容易被忽略的点日前调度用的是次日风光预测数据预测必然有误差。如果不给系统留任何灵活性哪怕误差只有百分之几执行时也可能出大乱子。储能和需求响应恰好就是吸收这些不确定性的“缓冲垫”。从这个角度看这个项目的意义不只是算出一组最优功率曲线而是展示了一个可实施的日前计划该怎么留有余地。1.3 适用人群与前置基础说实话这个项目的门槛不高很适合做本科毕业设计和研究生课程项目。前置知识只需要三块一是最基础的优化概念知道什么是目标函数、什么是约束条件、0-1变量拿来干什么二是Matlab基础语法能写脚本、能看懂矩阵运算就行三是对电力系统有一点基本了解至少知道功率平衡是个什么概念。模型求解建议用Yalmip工具箱搭配Gurobi或者Cplex这种组合在学术和工程圈子里都很常见。如果没有商业求解器Matlab自带的intlinprog也能跑只是速度慢一些对大模型的兼容性差一些。文中我会给出一套可以直接改参数运行的代码框架你拿到手后先跑通再慢慢替换成自己的数据和工作场景会比从零开始搭模型省力很多。2. 数学模型搭建目标函数与约束条件的推导2.1 目标函数里的每一项都对应一个防钻空子逻辑既然叫经济调度核心就是给“钱”建模。我建议把目标函数拆成三项从主网购电的成本、储能充放电运维成本、需求响应补偿成本。购电成本最好理解。风电和光伏的边际运行成本约等于零因为阳光和风不收钱设备投下去之后的运维成本按电量均摊也不是大头。真正需要花钱的是向外部电网买电所以必须按分时电价乘以购电功率来计费。这里分时电价是一个外部给定数组它本身也是驱动储能套利和需求响应削峰的关键信号。储能运维成本虽然数值很小但不加绝对不行。比如我设了0.02元/kWh的充放成本看起来不起眼但如果不加模型就会让电池一天到晚频繁充放反正不花钱最后解出来的是一堆毫无规律的动作完全脱离实际。需求响应补偿成本同理不给补偿单价模型会把负荷能削的全削掉用“虚假节电”撑起一个漂亮的总成本数字实际上用户的正常用电需求都被牺牲光了。所以每一项成本背后都有一个防钻空子的逻辑建模的时候要想清楚。这里做一个简化项目里没有传统机组所以不需要加柴油机燃料成本和启停成本。如果有燃气轮机或者柴油机目标函数里就要另外加燃料费、启动费、停机费同时引入机组启停的0-1变量模型会从线性规划升级成混合整数规划复杂度上一个台阶。建议先把眼前这套风、光、储、DR框架跑明白再去扩展传统机组。2.2 功率平衡与储能SOC递推约束模型能不能正确求解关键看约束写得对不对。第一个核心约束是功率平衡它强制要求任意时刻系统里“发出来的电”等于“用掉的电”$$P_{grid}(t)P_{wind}(t)P_{pv}(t)P_{dis}(t)P_{load}(t)-P_{dr}(t)P_{ch}(t)$$左边的Pgrid、Pwind、Ppv、Pdis分别是从主网购电、风电、光伏、储能放电的功率右边的Pload减去需求响应削减量Pdr是经过DR之后的真实净负荷再加上储能充电功率Pch因为充电相当于额外增加了一个用电设备。一句话概括等式左边是电源等式右边是负荷两边必须时刻相等。第二类核心约束是储能SOC递推关系。SOC是荷电状态也就是电池当前剩余容量占额定容量的比例它不能突变$$SOC(t1)SOC(t)\frac{\eta_{ch}P_{ch}(t)-P_{dis}(t)/\eta_{dis}}{E_{bess}}\Delta t$$这里ηch和ηdis分别是充电和放电效率。为什么充电和放电的效率都要写因为能量转换有损耗你不能用同一个效率去糊弄两个方向。充电1kWh只能存进去0.95kWh释放1kWh需要从电池里放出1/0.95约等于1.05kWh两个方向的不对称性如果简化掉SOC曲线就会偏乐观。SOC还需要上下限约束。锂电池安全运行范围一般取0.1到0.9初始值根据实际运行状态给定。我强烈建议加一个终端约束比如让SOC(24)不低于初始值或者干脆SOC(24)SOC(1)。如果不加模型会在最后一个时段拼命把电池放空来省成本这在连续运行的调度场景里完全不可接受相当于把一台设备的存量资产在一天之内清零。2.3 充放电互斥约束的处理储能充电和放电不能同时发生这是物理约束决定的。如果不约束求解器很可能算出一组既充电又放电的“伪解”充放电功率互相抵消等式约束依然满足成本还因为运维费多算了一些而失败但实际上这个动作是在白白损耗效率。解决办法是引入一个0-1变量u(t)表示当前时段的充放电状态。约束写成$$P_{ch}(t) \le u(t) P_{ch}^{max},\quad P_{dis}(t) \le (1-u(t)) P_{dis}^{max}$$当u(t)1时充电上限被放开、放电被锁死当u(t)0时反过来。这种写法在MILP建模里叫Big-M约束通俗地理解就是给两个动作各装了一个互锁的闸门。注意这里的充电功率上限和放电功率上限可以是不同的值比如我的演示代码里都取的100kW实际工程中快充和快放的倍率往往不一样。2.4 需求响应建模激励型最实用需求响应在学术文献里有两类建模方式。价格型DR通过电价弹性矩阵把负荷变化和电价耦合起来峰时电价高用户自发少用谷时电价低用户多用。这类模型更贴近市场行为但耦合关系往往导致非线性约束求解麻烦调参也容易翻车。激励型DR则是调度侧直接和用户约定我在特定时段削减你的用电量按削减量给你补偿。这种建模方式最直接只需要给Pdr加上下限约束和全天累计约束。我做这个项目时用的是激励型建模。原因很务实日前调度的执行场景就是这样你提前一天告诉用户“明天下午4点到6点你少用80kW我按0.35元/kWh补偿你”这是完全可操作的。价格型适合做需求响应潜力的长期评估放到市场机制设计里去用。对于初学者先把激励型搞明白再去研究价格型完全来得及。需求响应还有一个细节削减代价不是线性的。用户削减第一度电很容易往后越削越难所以理论上的最优建模是分段线性补偿价格削得越多单价越高。但分段会引入额外的整数变量把模型复杂度抬上去收益又不大。我建议先做线性补偿跑通之后再谈二次改进。2.5 风光不确定性的简化与弃电变量严格来说风电和光伏出力都是预测值预测不可能绝对准确。日前调度模型通常直接把它们当作确定性参数使用这种做法叫确定性优化。想更严谨可以把预测误差建出多个场景做随机优化或者用机会约束、鲁棒优化把不确定性包进约束里。但这都是后话对刚入门的人来说先把确定性模型跑透更重要。为了让模型更贴近实际我建议加入弃风弃光变量。做法是把实际消纳的风光功率写成决策变量让它小于等于预测值$$0 \le P_{wind}^{use}(t) \le P_{wind}^{forecast}(t),\quad 0 \le P_{pv}^{use}(t) \le P_{pv}^{forecast}(t)$$为什么要加这个因为极端情况下可能负荷很小、储能已经充满、从主网购电功率又压到了下限功率平衡里的电源侧总出力超过负荷侧需求此时等式无解。加了弃电变量系统就有了一个“泄压阀”宁可放弃一部分风光电量也要保证模型有可行解。这个细节很多教程不写你一旦用真实数据跑仿真几乎一定会遇到这种困境。3. Matlab实现全流程能直接改参数跑通的代码框架3.1 环境准备Yalmip和求解器的搭配动手写代码前先把环境理清楚。我推荐用Yalmip建模型用Gurobi当底层求解器。Yalmip是Matlab下的建模工具箱好处在于不需要手动把优化问题写成标准型矩阵只需要用符号变量把约束和目标函数“翻译”进去然后丢给求解器。Gurobi是商业级MILP求解器速度和稳定性都比Matlab自带方案强很多学术用户申请免费license也不麻烦。如果没有Gurobi用Matlab自带的intlinprog也能完成这个小规模项目24个时段的变量规模对intlinprog来说还在可接受范围内。版本方面不用追求最新Matlab R2018以后的版本配合对应的Yalmip版本都能正常跑。老版本在binvar变量的处理上出过一些莫名其妙的问题我自己遇到过所以建议别太老。安装Yalmip之后先用yalmiptest命令检查一下求解器是否被正确识别这一步能省掉后面一大堆报错排查。3.2 数据准备24小时负荷、风光预测、分时电价我习惯把所有输入数据放在脚本开头统一成一个参数区这样改起来一目了然。下面的数据是我虚构的演示数据但负荷曲线的双峰特征、光伏的正态日出曲线、风电的夜间大风特征都是按实际规律造的跑出来的结果具备参考意义。%% 基础参数 T 24; % 调度时段数 dt 1; % 时段长度单位h %% 预测数据单位统一为kW P_load [380 350 340 330 320 310 340 420 520 580 620 650 ... 660 640 620 600 640 680 720 660 580 520 450 400]; P_wind [80 85 90 95 100 90 75 70 60 55 50 70 ... 120 110 100 80 60 50 40 60 70 80 90 85]; P_pv [0 0 0 0 0 10 30 80 140 200 240 260 ... 250 220 180 120 60 20 0 0 0 0 0 0]; price [0.35 0.35 0.35 0.35 0.35 0.45 0.65 0.85 1.0 1.1 1.1 1.0 ... 0.75 0.75 0.8 0.95 1.05 1.05 0.8 0.6 0.5 0.4 0.35 0.35]; %% 储能参数 E_bess 400; % 电池容量kWh Pch_max 100; % 最大充电功率kW Pdis_max 100; % 最大放电功率kW eta_ch 0.95; % 充电效率 eta_dis 0.95; % 放电效率 SOC_min 0.1; SOC_max 0.9; SOC_init 0.5; C_bess 0.02; % 储能运维成本元/kWh %% 需求响应参数 Pdr_max 80; % 单时段最大削减量kW C_dr 0.35; % 补偿单价元/kWh Pdr_total_max 300; % 全天累计最大削减量kWh %% 购电上限 Pgrid_max 500; % kW这套数据里负荷有两个高峰一个在中午一个在傍晚晚高峰明显更大光伏在中午出力最大傍晚正好掉到零风电整体比较平稳傍晚略有爬升。分时电价也配合这个节奏晚高峰时间段电价冲到1.1元/kWh。看到这里你应该能预判储能的动作方向中午光伏大发时充电傍晚电价最高时放电同时需求响应在晚高峰削减负荷。后面看结果验证这个直觉就对了。3.3 变量建模与约束写入核心代码逐段解释接下来是核心代码。我用Yalmip的符号变量来声明决策变量逐个写约束最后统一求解。%% 定义决策变量 Pgrid sdpvar(T,1); % 从主网购电功率 Pch sdpvar(T,1); % 储能充电功率 Pdis sdpvar(T,1); % 储能放电功率 u_bin binvar(T,1); % 储能状态1充电0放电 SOC sdpvar(T,1); % 储能荷电状态 Pdr sdpvar(T,1); % 需求响应削减功率 %% 约束条件 C []; % 1. 功率平衡约束 C [C, Pgrid P_wind(:) P_pv(:) Pdis P_load(:) - Pdr Pch]; % 2. 储能SOC递推约束 C [C, SOC(2:T) SOC(1:T-1) (eta_ch*Pch(1:T-1) - Pdis(1:T-1)/eta_dis)*dt/E_bess]; C [C, SOC(1) SOC_init]; C [C, SOC_min SOC SOC_max]; C [C, SOC(end) SOC_init]; % 终值约束保证调度日净电量为零 % 3. 充放电互斥约束 C [C, 0 Pch u_bin*Pch_max]; C [C, 0 Pdis (1-u_bin)*Pdis_max]; % 4. 购电上下限约束 C [C, 0 Pgrid Pgrid_max]; % 5. 需求响应约束 C [C, 0 Pdr Pdr_max]; C [C, sum(Pdr)*dt Pdr_total_max]; %% 目标函数 Objective sum(price(:).*Pgrid*dt) sum(C_bess*(PchPdis)*dt) sum(C_dr*Pdr*dt); %% 求解 ops sdpsettings(solver,gurobi,verbose,1); result optimize(C, Objective, ops);这里说几个细节。SOC递推约束我用了向量化写法SOC(2:T)和SOC(1:T-1)错位对齐一次写完23个等式。如果你觉得不直观可以用for循环逐个时段写数学上是完全等价的。我个人更喜欢for循环因为一旦某个时段出错调试时能更快定位到是哪一个t出了问题。功率平衡约束里P_wind(:)和P_pv(:)是直接把预测数据当成已知量放进约束没有给弃风弃光留余地所以这套演示数据必须保证负荷加充电需求永远大于风光加放电供给。这也是为什么上面提醒你要加弃电变量——真实数据未必有这么温和的形状。目标函数里price(:).Pgrid是分时电价逐项乘以购电功率再求和单位是元。C_bess(PchPdis)统计储能充放的总电量乘以运维单价因为充一次放一次都产生损耗和维护成本。C_dr*Pdr是需求响应补偿。三项相加就是全天总运行成本。3.4 求解与结果提取跑完optimize之后第一步不是看结果而是看求解状态。Yalmip把求解状态放在result.problem字段0代表求解成功1代表不可行2代表无界。非零情况先排查模型和数据不要急着读变量。if result.problem 0 Pgrid_opt value(Pgrid); Pch_opt value(Pch); Pdis_opt value(Pdis); SOC_opt value(SOC); Pdr_opt value(Pdr); total_cost value(Objective); disp([总成本, num2str(total_cost), 元]); else disp(求解失败); disp(result.info); end求解成功之后我习惯画三张图功率平衡图、SOC曲线图、需求响应削减量柱状图。画图不是为了好看是为了快速验证模型行为是否合理。比如SOC曲线如果在某个时段突然跳变那一定是递推约束写错了功率平衡图上如果任意时段的“发电加放电”不等于“负荷减DR加充电”那一定是等式写漏了变量。先把这些基本校验做好再谈调参数。4. 仿真结果分析从功率曲线到方案对比4.1 典型日调度曲线怎么解读我用前面的参数跑了一遍结果符合预期中午12点到14点光伏大、电价低储能持续充电SOC从0.5一路涨到0.9左右傍晚18点以后光伏归零、负荷冲高、电价也冲到1.1元/kWh储能开始放电同时需求响应在19点到20点削减了约80kW的可中断负荷。这个结果拆开来看储能做的是“低充高放”的套利加削峰需求响应做的是“避峰”动作两种灵活性资源协调配合把原本要在1.1元电价时段买入的功率压了下来。看功率平衡图有个小技巧先看负荷曲线和新能源出力之间的缺口再对照电价曲线。缺口大且电价高的时段应该看到储能放电和需求响应被激活缺口大但电价低的时段则更可能从主网购电因为买电便宜没必要消耗储能寿命。储能、DR、购电三条线什么时候动基本就是电价信号的直接反映。如果出现“高电价还疯狂买电”的情况大概率是购电上限或者储能参数设置有问题回头查约束。4.2 有无需求响应的成本对比为了验证需求响应模块的作用我把Pdr_max和Pdr_total_max全部设成0相当于关掉DR再跑一遍同样的数据对比总成本。结果很直观加了需求响应之后系统总成本下降了百分之十几。原因就是高峰时段高价购电被削减虽然支付了需求响应补偿但省下的购电费更多净收益为正。这里的坑在补偿单价上。如果C_dr设置得比最高购电电价还高模型就能通过削减负荷来“套利”每少用1kWh电省的购电成本是1.1元但要付0.35元补偿这不是套利是倒贴。真正的危险是如果补偿单价高于电价模型会疯狂削减所有可削负荷总成本看上去更低其实是以牺牲用户用电权利为代价换来的结果完全失真。所以C_dr必须低于最高的购电电价最好还要结合真实可中断负荷的比例来设定。我在这个项目里还试过把需求响应的方式从“削减”改成“平移”也就是把负荷从高峰时段移到低谷时段总量不变。平移的建模比削减复杂一点需要增加移入移出的平衡约束但效果更符合实际用户不是白白少用电而是换个时间用。这一步扩展放在后头做很合适能明显提升论文的工作量完整度。4.3 储能容量敏感性分析与选型依据我还做了一组储能容量扫描分别取200、400、600、800kWh跑模型观察总成本变化。趋势是容量越大总成本越低因为在分时电价场景下大容量电池能在电价低谷多充电、高峰多放电替代更多高价购电。但边际收益明显递减从200加到400kWh成本下降很猛从600加到800kWh基本就平了。这说明储能容量不是越大越好要和负荷水平、电价差、充放功率上限匹配。超出一定规模之后多出来的电池容量根本没有足够的充放机会去赚钱纯属闲置投资。这种敏感性分析特别有用既能帮你在报告里解释“为什么取这个容量”也顺便回答了“储能投资值不值”的问题。更完整的做法还可以把储能本身的投资成本按寿命折算进目标函数做一个容量配置和调度的联合优化那就是另一个题目了。5. 这个方法能用到哪些场景5.1 从微电网到园区综合能源这里说的虽然是微电网但同一套建模思想放到园区综合能源系统、楼宇微电网、乃至小型工业园区的能量管理里几乎是直接平移。园区里如果有多栋楼、有屋顶光伏、有电储能还有中央空调这类柔性负荷优化的对象就变成“买电成本最小”“光伏消纳率最高”或者“碳排放最少”。只需要把负荷曲线换成园区总负荷把需求响应换成空调温度设定点调整或者充电桩调度其他框架完全不变。我做过的另一个类似案例是给一个数据中心的备用电源做调度优化。数据中心有柴发、有UPS电池、有不可中断的IT负荷优化目标变成“在保证供电可靠性的前提下把柴发油耗降到最低”。表面上看和微电网八竿子打不着但数学结构完全一致变量和约束的物理含义换一下就能用。这也是为什么我强调建模思维比代码本身重要——你掌握的是用数学语言描述物理系统的方法换场景只是换参数。5.2 从单日前调度到多日前滚动优化日前调度只有24个时段规模很小求解很快。但实际运行中往往需要滚动优化每15分钟或1小时重新计算未来24小时的计划用最新预测数据修正之前的偏差。滚动优化的原理很简单就是把“单日求解”改成“每步滚动求解”但代码上要处理好预测数据滚动窗口和SOC初值的传递否则误差会积累。如果扩展到几十台设备、8760个小时的年尺度仿真模型会大到MILP难以直接求解。这时候可以用启发式算法比如粒子群、遗传算法虽然不保证全局最优但胜在能处理大规模问题。神经网络和强化学习比如DQN在文献里也是热门方向但说实话对工程落地来说大规模线性规划加滚动更新仍然是更可靠、更好解释的做法。把日前调度的基线模型做扎实后面往哪个方向扩展都有底气。5.3 和目标函数扩展结合目标函数可以根据项目需求随便扩展。想体现环保就加碳排放成本想提高新能源消纳就给弃风弃光加惩罚系数想考虑储能寿命就把每个周期的循环次数折算成成本加进去。只要扩展项能表示成决策变量的线性或线性化表达式都能塞进Yalmip框架里求解。我遇到过不少同学卡在“目标函数写不进去”多半是因为把非线性项直接扔进去了。折中办法是分段线性化用整数变量近似非线性曲线虽然计算量增大但模型始终可控。6. 常见问题与调参避坑实录6.1 模型不可行首先查这两个地方最常遇到的报错就是“Problem is infeasible”或者中文环境下的“不可行问题”。我的排查顺序是固定的先看功率平衡约束是不是负荷减去需求响应后又加上了充电功率写错一个符号就完全无解再看SOC初值终值约束如果初始SOC是0.2、终值要求0.8但中间时段充电功率上限和充电时长根本充不到0.8那必然不可行。还有一个隐蔽坑如果SOC_min设置得过高比如0.5而储能容量又很小放电功率一放就掉到下限以下会直接锁死模型。所以参数设置要时刻对照物理常识不要为了好看乱填范围。购电上限也值得检查如果负荷远大于新能源加储能放电加购电上限无论怎么调都没救要么提高Pgrid_max要么适当允许失负荷。6.2 充放电同时生效的“伪解”识别方法分数情况是忘了加充放电互斥约束或者大M约束里的逻辑写反了。这类错误在结果里表现得特别隐蔽功率平衡等式完全满足总成本甚至可能更低但Pch和Pdis在某些时段同时大于0。怎么快速识别用一条Matlab命令max(Pch_opt .* Pdis_opt)如果结果不是0说明存在同时充放。修复方法就是老老实实把u_bin那两个互斥约束加进去。顺带提醒这里的u_bin是函数binvar生成的在Yalmip里可以参与线性约束但别对它做乘除运算弄出非线性系统就麻烦了。6.3 单位不一致和索引错位单位不一致是我见过最浪费时间的坑。负荷数据是MW储能数据是kW目标函数里电价单位是元/kWh最后算出来的成本差三个数量级图表线条也乱得不像话。我建议在参数区注释里强制标上所有输入的单位全部统一成kW和kWh。另一个低级错误是分时电价数组和负荷数组的时段索引错位比如电价在19点设成峰值但负荷峰值实际在18点导致优化结果里储能在错误的时段放电。6.4 求解器相关的报错处理Yalmip报错里最常见的是“No suitable solver found”意思是当前模型类型找不到对应求解器。通常是因为没装Gurobi或者装了但没在Matlab路径里。先跑yalmiptest看求解器列表确认quadprog、intlinprog、gurobi这些都在。另一个是许可证报错比如“License expired”之类这时候只能检查license文件或者换求解器没有别的办法。性能方面如果模型跑得很慢先检查是不是存在意外的非线性项。这个模型本来应该是线性规划或者混合整数线性规划一旦出现非线性项Yalmip会自动切换非线性求解器速度会断崖式下降。最常误用的写法是把两个变量相乘比如SOC和时间相乘、功率和价格变量相乘这些在标准优化里都会造成非线性能避免就尽量避免。7. 最后一点个人体会说实话这个项目做下来收获最大的不是那套代码本身而是建立起了一套“把调度问题数学化”的直觉。以前看电力系统的调度方案只看到一堆表格和曲线自己亲手建模之后才明白每一个决策变量背后都是一个物理设备的运行逻辑每一条约束都是在讲一个运行规则目标函数里的每一项都在表达一种经济利益权衡。这种理解是看书看教程很难替代的。最后分享一个小技巧不管你是做课程设计还是毕业设计一定记得把“基准方案”“加储能方案”“加需求响应方案”“储能加需求响应方案”这几组仿真做全并且放到论文或报告里做对比。这种对比不仅是展示工作量更是让导师或者审稿人一眼看懂你的模型到底改进了什么。如果时间允许再给需求响应补偿单价和储能容量各做一组敏感性分析图表往报告里一放整个工作的完整度会提升一大截。剩下的就是把你手上的真实数据替换进去反复调参慢慢磨了。