ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EMD+ARMA组合模型:风光功率预测从非平稳到平稳的工程化落地

EMD+ARMA组合模型:风光功率预测从非平稳到平稳的工程化落地 1. 为什么风光出力预测需要组合拳做新能源功率预测的同行应该都体会过这种焦虑早上八点调度员打来电话问“午间有一大块云过来光伏功率到底要掉多少”。风电那边也好不到哪去半夜风速突变场站功率一分钟能跳三十兆瓦。这种问题单靠一个ARMA模型是接不住的因为风光出力序列天生就是非平稳、非线性的但直接上深度学习又面临样本量少、可解释性差、现场部署麻烦的问题。所以这几年我在实际项目中反复用的路子就是标题里这个组合思路先用EMD把复杂功率序列拆开再用ARMA对拆分后的平稳分量逐个建模最后叠加出预测结果。这套方法不炫技但胜在稳定、快、能落地特别适合风电场和光伏电站做超短期到短期预测。这篇文章我想把整个探索过程写透包括为什么选这套组合、每个环节怎么做、代码怎么落地、哪些坑我踩过以后不会再踩。不管你是刚接手功率预测任务的运行人员还是在校做相关课题的学生应该都能拿走一些能直接用的东西。1.1 风光功率序列到底难在哪先说数据层面。风机出力的来源是风速风速本身受气压、温度、地形、尾流效应影响呈现明显的间歇性和随机性光伏出力的来源是辐照度受云层遮挡、太阳高度角、组件温度影响晴天曲线像钟形多云天曲线就像锯齿。把这些因素叠加到一起场站级功率曲线就变成了一段剧烈波动的非平稳信号。什么叫非平稳翻译成大白话就是序列的均值、方差、波动规律随着时间一直在变。比如光伏功率中午均值几百千瓦凌晨均值接近零比如风电阵风来了方差突然变大静稳时段整个曲线又像一条平线。ARMA这类线性时间序列模型核心假设是数据平稳均值方差基本恒定它才能用历史值做线性回归把未来推出来。你直接拿原始功率序列去拟合ARMA残差项里全是没消化的非平稳成分预测结果自然歪得厉害。另一个麻烦是序列里的多尺度特征。功率波动同时包含秒级的快速抖振、分钟级的阵风影响、小时级的天气过程、还有日级和季节级的周期规律。用一个模型通吃所有尺度就像让一个厨师同时做刺身和炖牛腩不是说做不到而是很难兼顾。EMD设计的初衷就是解决这种问题。1.2 为什么不敢直接用ARMA很多人刚接触功率预测时第一反应都是拿ARMA试试毕竟这是时间序列的入门模型代码几行就写完了。但测试几次就会发现直接用ARMA拟合原始功率序列会出现几个非常典型的问题。首先是参数估计不可靠。非平稳序列的自相关函数衰减得很慢ACF图呈现长拖尾这时候你按ACF/PACF定阶很容易把p、q定得很大模型参数一多小样本下过拟合几乎是必然的。其次是预测滞后严重。ARMA本质上是利用历史值的加权组合来预测对于趋势项和周期项它能部分跟随但对于突变性的功率爬坡预测曲线永远是慢半拍的风功率骤升骤降的场景直接失效。再者ARMA对强非线性的拟合能力有限它是线性模型而功率和风速之间是三次方关系这种非线性靠ARMA本身磨不出来。我见过不少项目死磕纯ARMA调参最后MAPE还是二十几个点。问题不在于ARMA这个工具不行而是把它用错了场合。ARMA擅长的是“平稳序列的短期线性外推”你得先帮它把数据整理成它擅长处理的样子。1.3 组合思路的核心逻辑EMD加ARMA的组合本质上是一条流水线预处理端用EMD做“信号拆解”预测端用ARMA做“分量预测”最后再做“信号重组”。EMD经验模态分解可以把一段复杂信号自动分解成若干个IMF本征模态函数和一个残差项。IMF的特点是从高频到低频依次排列每个IMF都是相对平稳的窄带信号。这正好满足ARMA的使用前提。打个比方一整块牛排很难烤得均匀但你把牛排切成片每片单独控制火候最后再拼盘反而更容易做出理想的效果。原始功率序列就是那块牛排EMD负责切ARMA负责煎预测完了再拼回去。这套组合还有一个额外的好处分解后的高频IMF和低频IMF可以分别处理。高频部分可以少预测几步或者用更保守的策略低频部分多预测几步也不容易跑偏。这给了工程师很大的调节空间而不像端到端黑盒模型那样出了偏差你连从哪里调都不知道。2. EMD分解的原理与实操要点EMD这几年在各种信号处理文章里出场率很高但真正把它跑通、用对的人不算多。它的核心思想说穿了很简单把一个信号里不同尺度的波动逐层剥离出来剥离的依据不是预先设定的频带而是信号本身的极值点分布。所以EMD被称为自适应的分解方法不需要像小波变换那样先选基函数和分解层数这对工程人员来说省了太多调参的麻烦。2.1 EMD的数学过程用大白话讲EMD做的事情简单说是反复执行下面几步第一步找到当前信号所有的局部极大值点和局部极小值点。第二步用三次样条曲线把极大值点连成上包络把极小值点连成下包络。第三步计算上下包络的平均值得到一条均值曲线。第四步用原信号减去均值曲线得到一个候选分量。第五步检查这个候选分量是否满足IMF的两个条件一是极值点数和过零点数相等或至多相差一个二是上下包络的均值在每一点上都接近零。如果不满足就把候选分量当作新的信号重复上述步骤如果满足就把它作为一个IMF提取出来然后用原信号减去这个IMF剩下的残余信号进入下一轮分解。这个反复筛选的过程业内叫“筛sifting”。最终你会得到一组从高频到低频排列的IMF以及最后一个单调或近似单调的残差项。关注细节的人会发现整个过程没有一个解析公式全靠迭代和样条插值所以它被称为“经验”模态分解。这个特点既是优点也是软肋优点是对非线性非平稳信号适应性强软肋是缺乏严格的数学理论基础分解结果不保证唯一。但这不妨碍工程上用因为功率预测要的是稳定可用的统计特征不是数学上的唯一性证明。2.2 在功率曲线上跑EMD的具体过程我习惯用Python的PyEMD库做分解接口非常简洁。核心代码只需要几行import numpy as np from PyEMD import EMD # signal: 一维数组比如某风电场过去30天的15分钟级功率 emd EMD() imfs emd(signal) # imfs的形状是 (n_imfs, n_points) # imfs[0]是最高频IMFimfs[-2]是趋势项之前的低频IMFimfs[-1]通常是残差就这么一段代码就能把功率序列拆成若干个分量。我实测下来一段30天、每15分钟一个点、一共2880个点的功率序列通常会分解出7到9个IMF加一个残差。第一个IMF对应原始序列里最细碎的快速波动频率最高越往后频率越低最后一个残差反映的是功率序列的长期趋势比如连续几天风资源由强转弱的变化。拿到分解结果后不要急着建模先做一件事把每个IMF画出来跟原始序列叠在一起看。这步非常关键目的有三个。一是确认有没有异常分量比如某个IMF包含明显的跳变或端点飞翼二是大致判断哪些IMF是有效成分哪些是分解的“副产品”三是为后续选择“哪些IMF参与ARMA建模、哪些直接忽略”提供直觉依据。2.3 分解结果怎么读哪些分量更重要功率序列分解出来的IMF不同分量在预测中的价值差别很大。我整理了一个经验性的判断表IMF序号频率特征典型含义预测处理建议IMF1最高频分钟级随机抖振、测量噪声可单独建模但预测步长越长越不可靠IMF2-3较高频阵风、云层快速遮挡引起的爬坡重点建模对象直接影响短时精度IMF4-5中频天气过程、辐照度小时级变化ARMA效果最好稳定且可预测性强IMF6-7低频日周期、天气系统更替适合较长预测步长建模价值高残差趋势长期资源趋势通常直接用简单外推或均值保持这里特别提醒一点不是分解出几个IMF就一定要建几个ARMA模型。有些IMF能量占比很小预测它对整体误差的改善可以忽略却白白增加了计算量。一般做法是计算每个IMF与原始序列的相关系数把相关系数很低的IMF直接合并或丢弃。我在项目里常用的阈值是0.05低于这个值的分量就不单独建模了。2.4 端点效应和模态混叠必须知道的两个坑EMD在工程落地时有两个臭名昭著的毛病端点效应和模态混叠。端点效应指的是序列两端没有完整的极值可供样条拟合时包络线会向端点外侧翘起来导致分解出的IMF在首尾两端产生明显的失真。这个失真虽然只影响两端一小段但对于功率预测来说太致命了因为你要预测的恰恰是数据最末端之后的未来值。如果不处理第一个预测点可能就被带歪。常用的缓解手段是端点延拓比如镜像延拓、极值延拓、多项式延拓。PyEMD里可以通过emd EMD()后设置相关参数但我自己的习惯是不复杂化直接在输入数据前多留一段历史数据让预测点远离端部。比如要预测未来16个点训练数据就至少留64个点的余量这样末端失真影响能被压缩到一个可接受的范围。模态混叠说的是一个IMF里混入了频率差异极大的成分或者同一个频率的成分被拆到了不同的IMF里。典型诱因是数据里存在间歇性的强扰动比如晴天光伏序列里忽然插入一段多云波动。遇到明显的模态混叠一个常用的补救措施是改用EEMD集合经验模态分解做法是给原信号多次加上白噪声再各自分解最后取平均。代价是计算量大增而且加了噪声之后的分解结果不再是确定性的。对于功率预测这种实时性要求高的场景我建议只在离线分析时用EEMD验证模态混叠程度在线预测尽量还是用标准EMD配合数据预处理比如平滑跳变点来解决。3. ARMA部分每个IMF单独建模的完整流程分解做完后面的工作就是ARMA的主场了。但这里要强调一个词单独。每个IMF都得走一遍完整的平稳性检验、定阶、参数估计、残差检验流程。这个流程不是走过场每一步都有它的目的。3.1 ARMA模型的适用条件再强调一次ARMA模型的基本方程是x_t c φ_1 x_{t-1} φ_2 x_{t-2} ... φ_p x_{t-p} ε_t θ_1 ε_{t-1} ... θ_q ε_{t-q}前一部分是自回归AR项意思是当前值和过去p个历史值存在线性关系后一部分是滑动平均MA项意思是当前值还受过去q个随机扰动的线性组合影响。这个模型所有系数都是常数所以要求序列的统计性质在时间上稳定这就是平稳性。还有一个隐含条件容易被忽略序列的线性相关性要足够强。如果某个IMF本质上已经是白噪声自相关系数基本为零ARMA拟合出来的系数统计不显著预测结果跟瞎猜差不多。所以对IMF做ACF图检查时如果看到ACF在滞后1阶就截断到零附近说明这个分量没有多少可预测性可以考虑放弃单独预测用零值或历史均值代替。3.2 平稳性检验与差分处理对每个IMF我首先做ADF检验。原假设是序列存在单位根非平稳如果p值小于0.05就拒绝原假设认为序列是平稳的。这样写from statsmodels.tsa.stattools import adfuller result adfuller(imf) p_value result[1] if p_value 0.05: print(该IMF可以视为平稳) else: print(该IMF需要差分处理)大部分IMF经过EMD分解后是能满足平稳性要求的但低频IMF和残差项常常例外。遇到不平稳的情况我一般做一阶差分把差分后的序列再检验一遍。这里注意如果对一个IMF做了差分那么预测完成后要把差分恢复回去也就是把预测值逐点累加叠回原始水平。很多新手忘了这一步导致重构预测功率时差了一个常数或者一个趋势我当时也犯过这个错。3.3 定阶ACF/PACF图和AIC/BIC怎么配合用定阶是ARMA建模里最有玄机的环节。理论上的做法是画ACF和PACF图看它们的截尾和拖尾特征如果ACF在q阶后截尾、PACF拖尾判为MA(q)如果ACF拖尾、PACF在p阶后截尾判为AR(p)如果都拖尾考虑ARMA(p,q)。但在实际功率数据上图经常模棱两可截尾不干脆拖尾拖得没完没了。这时候我的做法是老老实实用信息准则搜索。遍历p和q在0到3之间的所有组合分别估计模型记录AIC和BIC选最小的那一组。代码可以封装成下面这样import numpy as np from statsmodels.tsa.arima.model import ARIMA def select_order_and_fit(series, max_p3, max_q3, d0): best_aic, best_bic, best_order np.inf, np.inf, None for p in range(max_p 1): for q in range(max_q 1): if p 0 and q 0: continue try: model ARIMA(series, order(p, d, q)).fit() if model.aic best_aic: best_aic, best_bic model.aic, model.bic best_order (p, d, q) except Exception: continue print(f最优阶数: {best_order}, AIC{best_aic:.2f}) return ARIMA(series, orderbest_order).fit()这里特别提一下BIC和AIC的关系。BIC的惩罚项比AIC重更倾向于选择低阶模型。对小样本数据我优先按BIC选如果样本量够大比如超过1000个点AIC和BIC选出来的阶数通常差别不大。一个实操原则选出来的阶数不要超过3如果最优阶数是(3,3)要警惕过拟合可以手动降一档试试对比预测误差再做决定。3.4 参数估计与残差白噪声检验确定阶数之后ARMA参数的估计用的是极大似然估计statsmodels的fit()方法已经封装好了。得到参数后千万别直接拿去预测还差最后一步残差诊断。残差诊断的目的是确认模型已经把数据里的线性信息榨干了剩下的残差接近白噪声没有可提取的自相关结构。我用Ljung-Box检验原假设是残差序列不存在自相关p值大于0.05就说明残差合格。from statsmodels.stats.diagnostic import acorr_ljungbox resid fitted_model.resid lb_test acorr_ljungbox(resid, lags[10], return_dfTrue) p_value lb_test[lb_pvalue].iloc[0] if p_value 0.05: print(残差为白噪声模型可用) else: print(残差仍有自相关需要调整阶数或增加项)如果残差检验不过通常意味着阶数偏低或者这个IMF本身不适合用ARMA描述可能需要换成ARIMA加季节项或者干脆放弃对这个分量的预测。3.5 一句话提醒别一次把所有IMF都做成ARMA有一件事我反复跟同事强调不是每个IMF都值得用ARMA去拟合。高频IMF经常白噪声化严重强行建模不仅不提升精度还会引入额外的预测方差。低频残差项则往往倾向于用一个常数外推或者取最后N个点的平均值。我的做法是给每个IMF设置一个“可预测性门槛”先看它占原始序列的方差比再看它的ACF在1阶和2阶的数值如果ACF绝对值低于0.15就判定为不可预测分量。这个门槛没有标准答案跟数据的时间分辨率和预测尺度有关但思路是通用的把建模精力集中在能量占比高、自相关强的分量上这才是组合方法的正确打开方式。4. 组合预测的实操落地前面把两个模型的原理和坑都讲完了这一节把完整的流程串起来给你一套可以直接抄的工程骨架。4.1 准备数据和工具数据方面我建议用场站SCADA系统输出的实发功率时间分辨率15分钟比较合适。太细秒级数据噪声大EMD会分解出很多纯噪声分量太粗小时级又丢失了重要的爬坡信息。训练集的长度最低不要低于30天理想是90天以上覆盖不同天气过程。工具方面我用的是Python 3.9以上的环境主要依赖是PyEMD做EMD分解statsmodels做ADF检验和ARMA建模pandas / numpy数据处理matplotlib画图和检查分解结果需要提醒的是statsmodels新版本里已经把ARMA类合并进了ARIMA类你在代码里写ARIMA(series, order(p,0,q))实际上就是在拟合ARMA(p,q)。这个细节很多人会在查看官方文档时卡一下。4.2 分解-建模-预测-重构的完整代码骨架下面给一个最小可用的流程包含数据切分、EMD分解、分量建模、预测和重构import numpy as np import pandas as pd from PyEMD import EMD from statsmodels.tsa.arima.model import ARIMA from statsmodels.tsa.stattools import adfuller def fit_arma(series, max_p3, max_q3): d 0 if adfuller(series)[1] 0.05: series np.diff(series) d 1 best_order, best_aic None, np.inf for p in range(max_p 1): for q in range(max_q 1): if p 0 and q 0: continue try: model ARIMA(series, order(p, d, q)).fit() if model.aic best_aic: best_aic model.aic best_order (p, d, q) except Exception: continue return ARIMA(series, orderbest_order).fit(), d def predict_imf(imf_train, steps): model, d fit_arma(imf_train) pred model.forecast(steps) if d 1: pred np.cumsum(pred) imf_train[-1] return pred # 主流程 signal power_series.values # 一维数组 train_n 2400 # 训练点数例如25天 steps 16 # 预测未来4小时96点/天16点4小时 train signal[:train_n] test signal[train_n:train_n steps] emd EMD() imfs emd(train) pred_imfs [] for imf in imfs: pred_imfs.append(predict_imf(imf, steps)) final_pred np.sum(pred_imfs, axis0)这段代码的核心逻辑就四步分解训练序列对每个IMF单独拟合ARMA并预测把所有分量的预测值求和得到最终预测。实际项目中建议把max_p和max_q设成可配置的参数离线做一次参数扫描找到最优范围后再固化到在线流程里。4.3 滚动预测策略预测多长时间最稳很多做预测的人容易忽视一个基本定律预测步长越长精度越差。EMD-ARMA组合也不例外但在不同的时间尺度上表现不一样。我实测下来15分钟级数据下预测未来1到4个点15分钟到1小时这套组合的误差和更复杂的模型差距不大预测未来8到16个点2到4小时优势反而能体现出来因为低频分量的趋势外推起了作用超过24个点6小时以上误差会明显增大这时需要引入气象预报数据做修正。实际操作中我的推荐策略是滚动预测。每次拿到最新的真实功率值就把它拼到训练序列末尾重新做一次EMD分解和ARMA参数估计再预测下一个窗口。这种方法的计算开销不算大2880个训练点加7个左右的IMF跑一次全流程在普通办公电脑上只需几秒完全能满足15分钟的预测周期。需要注意的是重新分解后IMF的个数和顺序可能发生变化这对在线系统是一个挑战。我的处理方式是在线流程固定使用最近N个点的分解结果不要求每个周期IMF的物理含义完全对齐只要预测叠加后的总误差稳定就可以。4.4 误差指标怎么算怎么评价效果评价这套方法好不好不能只看一两天曲线要看统计指标。我常用的指标有三个RMSE、MAE、MAPE。RMSE对大幅偏差敏感适合衡量极端预测失误MAE直观反映平均偏差MAPE用百分比表示方便跟其他场站对比。但MAPE有一个陷阱当实际功率接近0时哪怕很小的偏差也会让百分比爆炸。光伏晚上真实功率是0MAPE直接变成无穷大。所以我一般用归一化指标NRMSE用RMSE除以场站装机容量这样得到的误差率在调度那边更容易理解。指标公式适用场景MAEmean(abs(actual - pred))平均偏差RMSEsqrt(mean((actual - pred)^2))对大偏差敏感NRMSERMSE / 装机容量跨场站横向对比MAPEmean(abs(actual - pred)/actual)仅限功率非零时段还有一个更贴近调度需求的指标爬坡事件捕捉率。功率预测不仅要总体偏差小还要准确预测功率骤升骤降的时刻和幅度。EMD-ARMA组合对中等频率的爬坡有明显优势因为分解后的IMF把爬坡信息单独拎了出来ARMA对它的外推比直接对原始序列外推要准。5. 常见问题与避坑经验这套组合方法我在多个场站的数据上跑过积累了一些典型的坑。挑几个出现频率最高的说希望能帮你少走弯路。5.1 预测曲线比实际曲线“太平滑”怎么办这是最常见的抱怨预测趋势对了但曲线太光滑没有实际功率那种毛刺感。原因在于高频IMF的预测值被ARMA压到了条件期望附近高频随机波动没有被还原。这个问题要分两种情况看待。如果预测目的是电力调度调度员要的是趋势和总量平滑曲线反而更好用但如果要做功率波动分析或者储能充放电策略平滑曲线会低估功率变化率导致控制策略过于保守。我的建议是把分解得到的高频IMF单独对待预测时不对IMF1做ARMA而是用最近几个周期的波动统计量做随机模拟把波动幅度加回去。这样既保留了ARMA对趋势的预测能力又不会丢失功率序列应有的波动性。5.2 极端天气下模型失效怎么兜底统计模型共同的弱点是无法应对训练集中没出现过的场景。大风天气骤起、雷暴云团过境、沙尘暴导致辐照度骤降这些情况下实际功率会快速偏离模型预测。这时候再去调ARMA参数没有意义问题不在模型而在输入信息。我现在的工程路线是把数值天气预报NWP作为外部输入先判断未来几个小时是否存在极端天气事件如果存在就用天气情景库里的相似日功率曲线做模板修正把EMD-ARMA的预测结果向模板方向拉。如果完全没有外部气象数据至少也要加一道逻辑校验预测功率不能超过装机容量光伏夜间预测必须归零功率变化率不能超过设备物理极限。这些边界条件能拦住大部分荒唐的预测结果成本极低强烈建议加上。5.3 样本量少怎么选模型阶数有的场站投运时间短历史数据只有两周样本点不到200个这种情况下强行跑EMD-ARMA会很难看。首先EMD在短序列上的分解稳定性差端点效应占比变大其次ARMA在小样本下参数估计方差大BIC惩罚也不足以完全压制过拟合。我的经验是少于500个训练点时把ARMA的阶数限制在(2,2)以内不要做网格搜索同时减少参与建模的IMF数量只保留相关系数大于0.1的中低频分量。如果数据量确实不够可以考虑先按天气类型聚类用相似日的模式补充训练样本。再不行就降低预测频率从预测未来16个点降到4个点以保证短时预测的可靠性为目标。5.4 和LSTM/Prophet比这个组合还有优势吗有人会问现在深度学习这么流行为什么还用ARMA这种老模型我的看法是要看场景。方法优点缺点适合场景EMD-ARMA计算快、可解释、小样本可跑线性外推能力有限中小场站、在线高频预测Prophet处理周期性强、内置节假日对突变适应弱、调参玄学光伏这样规律性强的序列LSTM非线性拟合强、大数据表现好需要大量数据、黑盒、部署重数据充足且算力充足的中心在实际风电场和光伏电站很多场站拿不到大量高质量历史数据现场还要面对模型更新频率、算力限制、可解释性要求。EMD-ARMA在“成本有限、预测周期短、需要快速迭代”的工程场景下仍然是最实用的选择之一。用LSTM当然可以秀肌肉但你要先搞定它背后的数据治理和线上推理架构。把基础模型做到位再逐步叠加更复杂的模型才是稳定推进预测系统建设的路子。5.5 在线运行时的性能优化小技巧如果在线预测系统每天要跑几十个场站全量重做EMD分解的计算量会累积起来。我常用的优化手段有两个。一是只在每天固定时间做一次全量EMD分解之后的每个预测周期只更新最后一段数据二是对分解结果做缓存用哈希值判断训练数据是否变化。实测下来这两种手段能把在线计算耗时压缩到原来的三分之一左右而且预测精度没有明显损失。6. 这个模型能带来哪些实际价值前面讲了很多实现细节最后说说这套方法到底能解决什么现实问题。功率预测从来不只是技术课题它直接影响电网调度、场站收益和设备安全。对调度运行来说超短期功率预测的精度直接决定旋转备用的容量。如果预测误差大调度就必须预留更多备用容量这部分成本最终会摊到整个系统的运行费用里。我参与的项目里风电场装机50兆瓦预测NRMSE从15%降到10%备用容量需求降低了大约2到3兆瓦一年算下来是相当可观的运行成本节约。对光伏电站来说提前4小时准确预测云层遮挡引起的功率跌落就能提前调整储能充放电策略减少弃光。对电力市场交易来说预测精度直接关联偏差考核。日前预测偏差大现货市场里就要承担更高的偏差结算费用。虽然这篇文章讲的是超短期组合预测但这个框架同样可以延伸到日前尺度——只要把训练窗口拉长、低频分量的权重提高预测结果完全可以作为日前申报的输入。对储能配置来说预测功率曲线是储能容量计算和充放电策略优化的基础输入。如果预测曲线过于平滑储能的调节深度会设计得偏保守容量利用率下降如果预测误差集中在爬坡时段储能又要额外预留更多功率容量。EMD-ARMA对爬坡时段的相对优势在这里就体现出来了。我个人在实际操作中的体会是这套方法最大的价值不是某个指标上的惊艳提升而是给了工程师一个可控、可解释、可迭代的预测框架。数据变了你可以调整分解策略预测误差集中了你可以定位到具体某个IMF的问题业务需求变了你可以只替换其中某一层模型其他部分不动。这种灵活度是黑盒模型给不了的。最后再分享一个小技巧预测结果出来之后先别急着送调度加一道限幅校验。我一开始没有做这步结果某天凌晨模型预测出十几兆瓦的光伏功率被场站同事笑了很久。后来我把“预测功率必须介于0和装机容量之间”“光伏夜间强制归零”“功率变化率限幅”这三条硬规则写进了系统里再也没出过这种低级问题。做预测的人基本功不是炫模型而是先把这些边界条件管住。
返回列表