基于雨流计数法的源-荷-储双层协同优化配置及Matlab实现

发布时间:2026/9/10 17:54:00
基于雨流计数法的源-荷-储双层协同优化配置及Matlab实现 看到这个标题估计你大概率也跟我当年一样第一眼觉得雨流计数法眼熟但不确定它怎么钻进储能优化里第二眼看到“双层协同”想起自己上一次把双层规划跑崩的场景头皮有点发麻。其实这是一个非常典型的储能容量配置研究课题标题已经把技术路线讲得很清楚——用雨流计数法刻画储能寿命用双层优化结构把“投资决策”和“运行调度决策”分开再在Matlab里落地实现。本文我会把这个研究从原理到代码完整拆开讲清楚雨流计数法怎么做储能寿命折算、源-荷-储双层模型怎么搭、Matlab代码框架怎么组织以及我实操过程中踩过的坑和排查思路。正在做储能配置、微电网规划设计、毕业设计或论文复现的同学这篇应该能帮你少走不少弯路。1. 先把课题拆明白四个关键词背后的技术逻辑这种复合型标题看着唬人但拆开以后其实是一条很清晰的技术链路。我习惯把“雨流计数法”“源-荷-储”“双层协同优化配置”“Matlab实现”这四个词分开理解它们分别回答了一个问题怎么做寿命评估、优化对象是什么、用什么决策框架、用什么工具落地。1.1 雨流计数法为什么会跑到储能配置里雨流计数法Rainflow Counting起源于材料疲劳寿命分析上世纪50年代由Matsuishi和Endo提出原本是用来处理金属材料在随机循环载荷下的疲劳损伤问题。核心思想很简单一段杂乱的应力-时间曲线可以分解成若干完整的、闭合的应力循环每个循环都有对应的幅值和均值再借助Miner线性累积损伤准则把每个循环的损伤累加就能估算材料还能用多久。把这个思路搬到储能系统上逻辑完全站得住。锂电池的寿命损耗和放电深度DOD强相关同样的充放电电量浅充浅放和深充深放造成的寿命损耗差别很大。而储能实际运行时的功率曲线、SOC曲线在新能源出力和负荷波动的双重影响下本来就是一段杂乱无章的“随机载荷序列”。你可以把SOC曲线当成材料的应力-时间曲线把每次充放电循环当成一个应力循环用雨流计数法统计出各个DOD区间发生了多少次循环再按寿命曲线折算成等效循环次数。这一套下来储能的寿命估计就不再是拍脑袋了。我打个比方方便理解一整天的SOC曲线像一片复杂屋顶雨流计数就相当于让雨滴顺屋顶流下每一滴雨水从开始流到滴落都对应一个完整的充放电循环。雨滴落在哪里、流速多快、从哪个屋檐滴下都有规则可循。这个类比虽然略显浪漫但确实是理解雨流计数最直观的方式。1.2 源-荷-储协同要解决的真实问题再看“源-荷-储”这三个字它描述的其实是并网型微电网或园区能源系统最常见的物理结构。源一般指分布式风电、光伏荷就是本地负荷储是电池储能系统。这三个要素凑在一起问题就来了。光伏出力白天高、晚上归零风电往往夜间出力大而负荷又通常有早晚两个高峰。电源出力曲线和负荷曲线在时间上错位导致两种结果要么新能源大发时段用不完只能弃风弃光要么负荷高峰时段新能源不足必须从电网买高价电。储能加入以后理论上可以在大发时段充电、在高峰时段放电把能量在时间轴上“搬”一下这就是削峰填谷和提升新能源消纳的基本逻辑。但储能不是免费的电池投资成本高、寿命有限容量配大了浪费投资配小了削峰填谷效果又不明显。源-荷-储协同优化配置本质上就是在问三个问题光伏和风电装多少、储能装多大功率、装多大容量才能让整个系统在全生命周期内的综合成本最低、新能源利用率最高。这已经不是一个简单的工程估算问题而是一个包含容量变量、时序运行变量和寿命非线性关系的复杂优化问题。1.3 双层优化与单层优化的本质区别按常理一个优化问题同时包含“装多少”和“怎么运行”理论上可以写成一个大的单层优化模型。但实际做下来你会发现单层模型的规模会迅速膨胀如果以小时为分辨率全年就是8760个时段的连续变量再加上储能容量和功率变量还要把储能寿命的非线性关系写进约束直接求解往往会遇到维数灾难和求解困难。更重要的一点是容量决策和运行决策天然是两个层级的问题。规划层的视角是“年”关心的是全生命周期成本运行层的视角是“小时/15分钟”关心的是每个时段怎么调度最省钱。把两者强行压进一个单层模型不仅数学上难解也不符合工程决策的实际流程——你总得先决定建多大规模的电站再谈日常运行怎么优化。双层协同优化把这个过程拆成上层和下层上层是配置层决定储能额定功率、额定容量、风光装机等“规划变量”下层是运行层在给定配置方案的基础上以日或典型日为单位优化各个时段的充放电功率、购售电功率等“运行变量”。下层把最优运行成本和运行结果反馈给上层上层再以此评估当前配置方案的好坏。两个层次通过迭代或嵌套的方式协同求解这就是“双层协同优化配置”的核心含义。2. 优化模型搭建目标函数、约束与寿命折算模型是这类研究的主心骨。很多初学者拿到课题就开始写代码模型还没理清楚代码越写越乱最后跑出结果也不知道对不对。我的习惯是先花一两天时间用纸笔把目标函数、决策变量、约束、求解策略全部理清楚再动手写Matlab。你在代码里碰到的80%的调试问题其实都是模型阶段没想清楚导致的。2.1 上层配置模型的数学表达上层模型的目标函数通常写成年综合成本最小化我这里给一个比较通用的表达方式$$ \min F C_{inv} C_{om} C_{rep} C_{grid} C_{penalty} $$其中$C_{inv}$是储能、风电、光伏的等年值投资成本$C_{om}$是年运行维护成本$C_{rep}$是储能电池的年度更换成本$C_{grid}$是年购电费用由下层运行优化结果决定$C_{penalty}$是弃风弃光惩罚和失负荷惩罚。这里有个关键点投资成本不能简单用一次性投资金额因为储能和光伏的使用年限不同电池可能运行到第8年就需要更换而光伏可以使用25年。工程上通常用资本回收系数CRF把一次性投资折算成每年等额支付$$ CRF \frac{i(1i)^n}{(1i)^n - 1} $$其中$i$是年利率$n$是设备寿命年限。这个式子看着简单但实际计算时很容易搞错——尤其要注意储能寿命年限$n$不是定值它会随着运行工况变化。如果电池每天深充深放可能5年就报废如果只是浅充浅放可能跑满10年。这就是雨流计数法在上层模型中的价值它通过下层返回的SOC曲线算出储能实际等效循环寿命再把$n$折算出来动态更新$C_{inv}$和$C_{rep}$里面的寿命年限。这一层逻辑想通了你就明白为什么雨流计数法和双层优化是“焊死”在一起的。上层模型的决策变量包括储能额定功率$P_{ess}^{rate}$、储能额定容量$E_{ess}^{rate}$、光伏装机容量$P_{pv}^{rate}$、风电装机容量$P_{wt}^{rate}$。约束条件比较宽松主要是容量上下限、光伏和风电安装面积或投资预算限制、储能功率与容量的匹配关系充放电倍率限制。2.2 下层运行调度模型的数学表达下层模型是给定上层配置方案后优化一个典型日或全年8760小时内的运行调度策略。目标函数通常是日运行成本最小$$ \min f \sum_{t1}^{T} \left( c_{buy}(t)P_{buy}(t)\Delta t - c_{sell}(t)P_{sell}(t)\Delta t c_{curt}P_{curt}(t)\Delta t c_{loss}P_{loss}(t)\Delta t \right) $$这里$c_{buy}(t)$和$c_{sell}(t)$是分时购售电价$P_{buy}(t)$和$P_{sell}(t)$是时段购售电功率$c_{curt}$是弃风弃光惩罚单价$P_{curt}(t)$是弃电量$c_{loss}$是失负荷惩罚单价$P_{loss}(t)$是失负荷量。约束条件是这个模型的精华部分我列出几个最容易写错或漏掉的第一是功率平衡约束。每个时段都必须满足$$ P_{pv}(t) P_{wt}(t) P_{buy}(t) P_{dis}(t) P_{load}(t) P_{sell}(t) P_{ch}(t) P_{curt}(t) $$左边是电源侧出力右边是负荷侧消耗。注意储能充电和放电不能同时发生要么加互补约束要么直接规定变量上下限防止同为正。第二是储能SOC递推约束$$ SOC(t1) SOC(t) \frac{\eta_{ch}P_{ch}(t)\Delta t}{E_{ess}} - \frac{P_{dis}(t)\Delta t}{\eta_{dis}E_{ess}} $$其中$\eta_{ch}$和$\eta_{dis}$是充放电效率通常取0.95和0.9左右。SOC要满足上下限约束一般取10%到90%防止过充过放。第三是储能初末SOC相等约束。这个约束很容易被忽略但非常重要——它代表储能系统在一天运行结束后电量状态回到起点不会出现“越存越多”的白嫖现象。在多日连续运行场景里这个约束还可以换成“周期内净电量偏差不超过阈值”配合跨日调度。第四是购售电功率约束、弃风弃光约束、失负荷约束这些本质上都是上下限约束但要注意购售电一般不能同时为正工程上通常用两个非负变量和一组互斥约束来表达。2.3 雨流计数嵌入优化的三种可行方案模型建到这一步最核心的问题就浮出来了雨流计数法这种“数据统计类算法”怎么塞进一个数学优化模型里这不是天然的凸函数也很难直接写成解析约束。我在实操中总结出三种可行方案各有适用场景。第一种是“外层事故后折算”。用下层模型算出储能SOC曲线后把SOC序列单独拿出来做雨流计数得到各DOD区间的循环次数分布再按寿命曲线折算储能的等效寿命损耗把损耗成本反馈给上层目标函数。这种方案逻辑最直观代码实现也最简单但问题是每次上层评估一个个体都要完整做一次下层优化和一次雨流计数计算开销很大。适合GA种群规模不大、时序数据取典型日的场景。第二种是“惩罚项近似”。在建立下层优化模型时就把充放电行为折算成寿命损耗惩罚项放进目标函数比如用循环次数与充放电电量的线性关系来估计损耗成本。方案二的好处是可以在下层模型内部考虑寿命因素运行层会自动避免“廉价但伤电池”的调度方案精度比方案一稍差但胜在求解速度快适合做方案初筛和工程快速评估。第三种是“约束线性化”。把储能寿命曲线分段线性化将雨流计数中最重要的“DOD-循环寿命”关系转化为一组线性约束并入上层或下层模型。这样做的好处是可以直接用混合整数线性规划求解器不用外挂GA稳定性最好。缺点是分段的误差需要提前测试而且未考虑循环次序和平均SOC对寿命的影响。就我做课题和复现论文的经验来说如果你是做学术研究、追求结果精度推荐方案一如果只是工程上快速估算容量方案二或三更实用。后面的代码实现我重点以方案一为例展开。3. Matlab代码实现从数据准备到求解器配置Matlab实现这个课题难的不是单个函数而是怎么把上层GA、下层线性规划和雨流计数三个模块串起来。很多同学代码写到一半跑不起来大多数是模块之间的数据接口没设计好。3.1 代码框架设计与文件组织我建议按功能把代码分成独立文件方便单步调试。这里给出一个我常用的工程目录结构├── main.m % 主程序入口 ├── config_data.m % 参数配置与数据加载 ├── upper_ga.m % 上层GA优化 ├── func_adaptation.m % 上层适应度函数 ├── lower_opt.m % 下层运行优化LP ├── rainflow_life.m % 雨流计数与寿命折算 └── plot_results.m % 结果绘图main.m的逻辑很固定调用config_data.m读取参数调用upper_ga.m启动上层优化得到最优配置方案后用最优配置再跑一遍下层模型和雨流计数最后画图。config_data.m里放的是所有基础参数。我的习惯是全部用结构体管理比如param.ess.cost_unit_power表示储能单位功率投资成本param.elec.price_buy是分时购电价数组。全用结构体能避免变量名冲突也方便后面做参数敏感性分析时批量改参数。3.2 雨流计数函数的Matlab实现雨流计数是核心模块之一。Matlab的信号处理工具箱自带rainflow函数它在疲劳分析领域是标准货可以直接调用[cycles, mean_level] rainflow(soc_seq);但注意工具箱自带的rainflow函数返回结果是按“全循环”和“半循环”混在一起的你需要再写一段代码把循环幅值转换成DOD分布同时剔除幅值过小的噪声循环。另外如果要在GA迭代中调用成千上万次工具箱自带函数性能可能不够我建议写一个简化版的四点法计数函数只提取全循环速度能快好几倍。四点法的核心逻辑是从序列中依次取四个峰谷点如果中间两个点构成的循环幅值同时小于等于前一段和后一段的幅值就判定为一个全循环提取出来然后删除这两个点继续向前回看。这个过程不断重复直到剩下无法配对的一组残余点。残余点按半循环处理每个计0.5次。我给出一个简化的Matlab函数框架方便理解function [dod_dist] my_rainflow_dod(soc_seq) % 简化版雨流计数输入SOC序列输出DOD循环分布 % 预处理只保留转折点去除相邻重复点 extrema soc_seq(diff([soc_seq(1); soc_seq(:)]) ~ 0); if length(extrema) 3 dod_dist []; return; end res extrema(:); dod_list []; % 四点法遍历 while length(res) 4 n length(res); found false; for k 2:n-2 x1 res(k-1); x2 res(k); x3 res(k1); x4 res(k2); if abs(x3-x2) abs(x2-x1) abs(x3-x2) abs(x4-x3) dod_list(end1) abs(x3-x2); % 循环幅值即DOD res(k) []; res(k-1) []; found true; break; end end if ~found break; end end % 残余点按半循环处理 for k 2:length(res) dod_list(end1) abs(res(k)-res(k-1)) * 0.5; end dod_dist dod_list; end写这个函数时我踩过一个坑res(k) []删除元素后循环索引必须回退否则会漏掉可提取的循环。更高效的写法是用while加指针不需要每次从头扫描整个数组但上面这个版本逻辑更清晰适合新手理解。等代码跑通了再优化性能也不迟。拿到DOD分布后就可以折算寿命了。锂电池的循环寿命与放电深度通常满足幂函数拟合关系$$ N_f(DOD) N_{ref} \cdot \left( \frac{DOD}{DOD_{ref}} \right)^{-k_p} $$其中$N_{ref}$是参考DOD下比如80% DOD的循环寿命次数$k_p$是拟合指数通常在1.1到2.1之间。根据Miner准则总寿命损耗是每个循环损伤之和$$ D_{total} \sum_{i} \frac{n_i}{N_f(DOD_i)} $$储能总共能运行的天数就是$1/D_{total}$等效寿命年限 运行天数 / 365。这个值就是前面说的“动态寿命年限”回传到上层模型去更新$C_{rep}$和$C_{inv}$。3.3 GA与线性规划嵌套的调用细节上层优化我推荐用遗传算法GA原因很直接下层返回的运行成本与上层容量变量之间不是光滑的显式函数关系梯度信息很难求。GA不需要梯度只要把每个个体解码后调用下层求解器返回适应度即可。在Matlab中GA调用optimoptions配置参数核心代码大约长这样nvars 4; % 储能功率、储能容量、光伏容量、风电容量 lb [0, 0, 0, 0]; ub [5, 10, 10, 10]; options optimoptions(ga, ... PopulationSize, 40, ... MaxGenerations, 30, ... Display, iter, ... UseParallel, true, ... FunctionTolerance, 1e-4); [x_opt, fval_opt] ga((x) func_adaptation(x, param), nvars, [], [], [], [], lb, ub, [], options);func_adaptation.m是上层的适应度函数它内部要做的事情是第一步把GA传来的染色体x解码成储能额定功率、储能容量、光伏容量和风电容量。第二步把配置参数传给lower_opt.m求解下层线性规划问题得到日运行成本和SOC曲线。第三步把SOC曲线传给rainflow_life.m算出储能寿命和年化成本。第四步把投资成本、运维成本、替换成本、购电成本全部加总返回年综合成本。这里有个细节GA默认是最小化适应度所以适应度函数直接返回年综合成本即可不需要取反。下层优化我建议用Matlab自带的linprog或solve问题式框架实现。以linprog为例需要把功率平衡、SOC递推、上下限约束全部写成线性等式和不等式矩阵。这里最容易出错的是“储能不能同时充放电”这个约束通过设置决策变量上界可以直接避免或者加一组大M约束。我一般直接把充电功率和放电功率设为两个独立变量的上界让优化器自己决定什么时候充、什么时候放。另一个非常实用的技巧是在GA迭代过程中把已经算过的个体-适应度对保存下来。GA在进化时会有大量重复个体或相似个体如果每次都重新调用下层LP和雨流计数计算量会白白翻倍。用containers.Map存历史结果能省下至少20%到30%的计算时间。这是我调试时意外发现的加速方法非常推荐。4. 算例设计与结果解读让优化结果经得起细看模型和代码都跑通以后最怕的事情就是“代码能跑但结果没人敢信”。这类研究的核心是让结果真正反映系统行为所以算例设计不能随便拍脑袋。这里我以一个典型的并网型园区微电网为例说明数据怎么准备、结果怎么解读。4.1 基础数据与参数设置我先给出一套我常用的基础参数示例参数数值说明光伏单位投资成本4000元/kW含逆变器与安装风电单位投资成本7000元/kW含基础与并网储能单位功率成本1500元/kWPCS变流器储能单位容量成本800元/kWh电池电芯与BMS参考循环寿命5000次80% DOD磷酸铁锂典型值寿命拟合指数kp1.5幂函数拟合指数年利率5%折现率项目周期10年全生命周期分析充放电效率0.95 / 0.9充电/放电SOC上下限0.1 ~ 0.9防止过充过放购电价峰1.2元/kWh08:00-11:00、18:00-22:00平时段0.7元/kWh其他时段谷段0.35元/kWh23:00-07:00风光负荷的时序数据我倾向先用公开数据集比如IEEE RTS系统的负荷数据叠加一个模拟的风光出力曲线。光伏用Beta分布模拟风电用Weibull分布模拟这是比较通用的做法。当然如果你有实际项目的实测数据直接用实测数据效果最好。关键在于数据的时间分辨率建议至少用1小时分辨率有条件可以采用15分钟分辨率因为储能SOC曲线的“毛刺”和波动细节直接决定了雨流计数能否把所有浅循环统计出来——太粗糙的时间分辨率会漏掉大量浅循环寿命估计偏乐观。4.2 对比方案设计与结果分析为了说明雨流计数法和双层协同的价值我建议至少设计三组对比第一组是“考虑雨流计数法的双层协同优化”也就是本文的核心方案。第二组是“不考虑雨流计数法的双层优化”将寿命简单按当年总放电量除以额定容量折算。第三组是“单层优化”把所有容量和运行变量放进一个大模型求解这个方案基本等价于不考虑分层决策的“理想化结果”。以我手头一个典型算例的结果为例方案储能容量/MWh储能功率/MW光伏容量/MW年综合成本/万元雨流双层协同3.21.66.0486无雨流折算双层4.12.16.0534单层理想化3.01.56.0468这组结果背后有一个很有启发性的规律加入雨流计数法之后最优储能容量反而比简单折算方案小了近1 MWh。原因在于简单折算方式把浅充浅放也算成全额循环寿命损耗被高估优化器为了“稀释”循环深度不得不配置更大的储能容量而雨流计数法把浅循环的实际损伤准确计了进来优化器发现浅充浅放对电池寿命的影响没有想象中严重于是用更小的储能容量就能达到同样的调节效果。单层理想化方案的容量最小、成本也最低但它在数学上是一种“上帝视角”实际工程中难以直接指导决策更适合作为下界参考。4.3 结果的工程可信度检查算例跑完以后别急着把结果写进论文或报告先做一轮结果合理性检查。我整理了几个最关键的检查项。第一看SOC曲线是否在边界停留时间过长。如果SOC长时间被顶在0.9或压在0.1附近说明储能容量配置偏保守或偏激进需要回头检查约束是否合理。正常的光储联合系统SOC曲线应该在0.2到0.8之间有一定起伏。第二看储能每天循环次数是否符合预期。用雨流计数统计出来的DOD分布如果绝大多数循环都集中在0.1到0.3之间说明储能在做浅充浅放寿命会很乐观如果大量集中在0.8以上说明系统在深度充放储能寿命会明显缩短。这两种情况都对应不同的工程现实需要和实际场景对照。第三做一次敏感性分析。把光伏和风电的单位投资成本上下浮动20%看最优容量是否发生剧烈跳变。一个稳定的模型结果不应该对参数微调过度敏感。如果容量从3 MWh跳到8 MWh说明模型里可能有约束是“裸奔”的——比如漏掉了某个重要约束或罚项过轻。5. 常见问题与排障实录5.1 双层迭代不收敛或搜索震荡双层优化最常见的故障之一就是GA迭代十几代以后适应度曲线还在大幅震荡甚至越优化越差。我排查这类问题的顺序是先看目标函数的量级再看变量边界最后检查下层LP是否稳定。投资成本通常是百万级日运行成本可能只有几千到几万两者相加后运行成本的变化被投资成本稀释GA几乎感受不到运行层的反馈。解决办法是先把各项成本归一化或者给每项设置合理的权重系数。另外如果下层LP在某些极端配置下无解GA对应的适应度会退回一个很大的罚值这个罚值如果太大会造成适应度景观里出现“悬崖”GA很容易掉进局部最优。我建议下层无解时不要简单返回inf而是返回“当前约束下可运行但不满足某约束”的有界罚值陡峭程度控制在目标值量级的1到2倍范围内。5.2 求解器与运行环境问题Matlab环境相关的坑主要集中在求解器配置上。如果你用YALMIP工具箱调用CPLEX或Gurobi最常见的问题是安装路径没加进Matlab搜索路径或者求解器许可证没有启动。这类问题的排查方法很机械先打开YALMIP自带的sdpsettings(verbose, 2)查看求解器调用日志确认是否真的调到了CPLEX。还有一个比较容易踩的坑是Matlab版本升级后linprog的内置算法改变。2020b以后linprog默认算法改为内点法在做大规模双层嵌套时可能表现不同。大多数情况下把Algorithm显式设为interior-point-legacy或dual-simplex就能解决。我没有必要在这里吹捧某个版本的新功能但有一点可以确认只要你的Matlab自带Optimization Toolbox这套代码在2020b到2024a的版本上都能稳定运行。5.3 雨流计数拖慢整体寻优速度计算性能是这类研究绕不开的问题。假设GA种群数40、进化30代至少需要1200次适应度调用。每次调用要解一个下层LP变量规模视时间分辨率而定24小时约100个变量8760小时约几千个变量还要做一次雨流计数。如果雨流计数函数写得低效整个寻优时间会翻一倍不止。我的优化建议有三条。第一在雨流计数前先对SOC序列做转折点提取把数据量从几千点压缩到几百点。第二全循环提取循环体内使用while配合指针回退避免每次从头扫描。第三对浅循环设置一个最小幅值阈值比如DOD小于0.5%的循环直接忽略它们在寿命损耗中的贡献几乎可以忽略但计数过程白白消耗大量时间。5.4 结果不合理时的排查顺序最后分享一个排查经验。当优化结果明显不合理时按这个顺序检查基本不会漏先查单位一致性储能容量是否统一用了MWh功率是否统一用了MW成本是否统一用了万元再看参数里有没有笔误比如把充放电效率的0.95写成0.095然后检查SOC递推公式里的时间步长Δt有没有除以1使用小时分辨率时Δt1如果原始数据是15分钟粒度Δt必须等于0.25最后检查初末SOC相等约束是否生效这个约束一旦失效下层模型会“作弊”式地利用储能初始电量来压低日运行成本导致配置结果直接失真。我在实际调试中碰到过一个非常隐蔽的问题我把SOC序列直接拿去做雨流计数但忘了把SOC的初值偏移修正掉。SOC在50%到60%之间波动和SOC在20%到30%之间波动对电池寿命的影响其实不完全一样但基础的雨流计数函数默认只关注幅值忽略了均值的影响。后来我在折算寿命时加入了一个平均SOC修正系数结果才合理起来。这类细节常规文档里基本不会写但对结果精度影响不小。做这个课题写到最后一版代码时我最大的体会是雨流计数法不是论文里“炫技”的点缀它回答的是一个非常实在的工程问题——你的储能到底能用几年。很多容量配置研究把储能当作寿命年限固定的设备这恰恰是偏差最大的地方。建议初做这个课题的同学第一版代码不要急着上双层和复杂求解器先用一个简单场景把“配置—调度—寿命”这条链路整体跑通把雨流计数函数写对再考虑用GA加LP扩大规模。等整条链路稳定了还可以考虑把典型日扩展到多场景把线性模型往混合整数方向演进。这个顺序比任何技巧都重要。最后再分享一个小经验多留一点时间做参数敏感性分析审稿人和导师最常问的问题大概率就是“你这些参数改一改结论还成立吗”。