资讯动态

基于Copula的风光联合场景生成:微电网调度与储能配置实战指南

发布时间:2026/9/15 9:06:22 来源:尧图企业网站定制
做风光互补项目的人几乎都会遇到同一个问题明明风电和光伏单看都很正常但放到同一个微网里一跑储能容量要么配多了、要么不够用调度策略也总是差点意思。这背后十有八九是没有把风电和光伏出力之间的空间相关性考虑进去。我早期做微电网日前优化调度的时候也踩过这个坑后来换成了基于copula的风光联合场景生成方法问题才算真正解决。这篇东西不是教科书式的理论堆砌是我自己做项目时的完整记录copula方法怎么选、数据怎么处理、场景怎么生成、生成之后怎么接入调度和储能配置以及中间踩过哪些坑。适合正在做新能源出力不确定性建模、微电网调度优化、储能容量配置的工程师和研究生参考里面有可以直接抄作业的代码框架和参数经验。1. 为什么要做联合场景生成而不是单机采样1.1 单机场景的局限性很多初学者上来就先做风电场景、再做光伏场景然后把两组场景简单拼在一起。表面上看似乎没什么问题风电有风速数据光伏有辐照度数据各自都能用ARIMA、马尔可夫链或者概率分布采样生成一堆场景。但拿到调度模型里一跑就会发现很多场景组合在现实中根本不会发生。举个例子某地区白天强风、夜间无风光伏正好相反白天大发、夜间为零。如果两个场景独立生成就可能出现“夜间大风光伏满发”这种荒谬组合调度模型为了应对这种场景会配置大量冗余储能成本直接上去。而真实情况是同一个天气系统往往同时影响风资源和光资源比如锋面过境时风速增大、云量也增多风电出力上升、光伏出力反而下降二者存在明显的负相关关系。所以问题的本质不是“能不能生成场景”而是“生成的场景是否符合物理规律和空间相关性”。独立采样出来的场景概率空间是两件事的笛卡尔积里面混了大量低概率甚至零概率的组合把它们喂给优化模型只会得到过度保守的结果。1.2 空间相关性对下游决策的实际影响空间相关性影响的不仅是场景本身的合理性更直接影响工程决策。我做过一个实际项目某园区微网配置了2 MW风电和1.5 MW光伏储能容量规划阶段分别用独立场景和联合场景做优化结果储能配置差了将近30%。原因很简单独立场景下最恶劣的组合是“风电光伏同时大发”和“同时小发”这两种情况都会扩大净负荷波动储能得照最极端情况去配而联合场景还原了真实的负相关关系之后“同时大发”的概率实际上很低储能配置自然可以更贴近实际需求。类似的问题在配电网的净负荷预测、虚拟电厂聚合调度、电力市场申报中都会遇到。你越往后做越会发现相关性不是锦上添花的细节而是决定模型是否可信的关键因素。1.3 copula为什么适合干这件事copula的核心思想很朴素把一个多维随机变量的联合分布拆成两部分一部分是每个变量的边缘分布另一部分是变量之间的相关结构。这样做的好处是你可以自由地为风功率和光伏功率选择最合适的边缘分布同时独立地刻画它们之间的相关性不用受限于多元正态分布那种“边缘分布必须是正态”的束缚。风光功率数据的边缘分布形态通常很复杂——风电功率往往右偏、在额定功率附近有聚集光伏功率则严重右偏且有大量零值。如果用传统的多元分布去拟合效果会非常差。copula把这两个问题解耦之后建模就灵活多了。一句话理解copula它就像是把“每个人长什么样”和“几个人之间的关系”分开来研究。你不需要为了描述关系的复杂性而强行让每个人都长成一个模子。2. copula模型选型与参数估计别一上来就高斯2.1 常用copula家族对比说句实在话很多人看到copula就问“用哪个”我的第一反应是反问“你的数据是什么样的相关性”。不同copula擅长描述的相关结构完全不一样选错了还不如不选。copula类型公式/定义擅长描述的相关性适用场景Gaussian copula(C(u,v)\Phi_\rho(\Phi^{-1}(u),\Phi^{-1}(v)))对称相关、无尾部相关性风电-光伏整体负相关的基线选择t-copula基于多元t分布构造对称相关、上下尾均有相关性极端天气下风、光同时出现大波动的场景Clayton copula(\phi(t)t^{-\theta}-1)下尾相关强低出力时段无风且阴天的联合概率刻画Gumbel copula(\phi(t)(-\ln t)^{\theta})上尾相关强大风且晴天导致出力同时爬升的场景Frank copula(\phi(t)-\ln\frac{e^{-\theta t}-1}{e^{-\theta}-1})对称相关、尾部相关性弱相关结构比较平缓、没有极端联动的情况如果你只打算用一个做全季节拟合Gaussian copula通常是下限最高、最稳的选择因为它参数少、估计简单、对数据量的要求低。但如果你的数据里存在明显的“同时为零”或“同时满发”的时段——比如冬季阴天大风天气系统导致风大但云厚光伏低出力和风电高出力同时出现——t-copula和Clayton copula可能更合适。我的做法是先分别拟合几个候选copula再用AIC/BIC做比较而不是拍脑袋定。下面这个代码片段是Python中基于SciPy实现的高斯copula参数估计和模拟import numpy as np from scipy.stats import norm, rankdata # wind_pv: shape (n_samples, 2) 的历史风电、光伏功率序列 # 转换为伪观测值经验分布函数值 u_wind rankdata(wind_pv[:, 0]) / (len(wind_pv) 1) u_pv rankdata(wind_pv[:, 1]) / (len(wind_pv) 1) # 高斯copula的参数就是伪观测值正态变换后的相关系数 z_wind norm.ppf(u_wind) z_pv norm.ppf(u_pv) rho np.corrcoef(z_wind, z_pv)[0, 1] print(Gaussian copula 相关系数 rho , rho) # 生成联合场景先采样均匀分布及相关结构再逆变换回功率 np.random.seed(42) n_scenarios 1000 z_sim np.random.multivariate_normal([0, 0], [[1, rho], [rho, 1]], sizen_scenarios) u_sim norm.cdf(z_sim)如果连rankdata这一步都嫌麻烦MATLAB里有现成的copulafit和copularnd直接调用就行后面会给出对应代码。2.2 参数估计与拟合优度检验如果你用MATLAB参数估计非常简单% U: 伪观测值矩阵, n x 2 % 高斯copula rho copulafit(Gaussian, U); % t-copula [rho_t, nu_t] copulafit(t, U); % Clayton, Gumbel, Frank 属于阿基米德族 param_clayton copulafit(Clayton, U); param_gumbel copulafit(Gumbel, U); param_frank copulafit(Frank, U);拟合完不等于结束必须做拟合优度检验。我常用的有两种方式第一种是对数似然比较直接看哪个copula在样本上的对数似然值最高同时用AIC惩罚参数数量。AIC越小越好[ AIC -2\log L 2k ]其中(k)是copula的参数个数Gaussian是1个、t是2个阿基米德族一般是1个。第二种是经验copula对比。把原始数据的联合经验分布与拟合copula的联合分布放在一起计算两者之间的平方距离Cramér-von Mises统计量。这个方法的优点是直观能看出在哪些区域偏差大。比如如果原始数据右下角风电高出力光伏低出力的密度明显高于拟合的高斯copula说明数据有明显的尾部行为该换t或Clayton试试。注意伪观测值转换时长度不要直接用样本量作分母用(n1)是经验做法可以避免变换后严格落在1上导致后续逆变换出现无穷大。2.3 相关系数的度量陷阱这里必须强调一个最常见的坑很多人直接用Pearson相关系数来评估风电和光伏的线性相关性然后把这个数填进高斯copula。这么做在数据呈椭圆分布时问题不大但风光功率数据普遍偏态、还有大量边界值0和额定功率Pearson相关系数会被极端值严重扭曲而且它描述的是线性相关线性相关系数为0不代表独立。做copula建模时建议用**Kendall秩相关系数(\tau)或Spearman秩相关系数(\rho_s)**来度量相关性。它们的优势是不依赖具体的边缘分布纯粹反映变量之间的单调相关关系。更重要的是对很多copula来说(\tau)和参数之间有封闭解比如Clayton: (\tau \frac{\theta}{\theta 2})Gumbel: (\tau 1 - \frac{1}{\theta})Gaussian: (\tau \frac{2}{\pi}\arcsin(\rho))这意味着你可以先算样本的(\tau)反推出copula参数初值再用极大似然精修。我实际做的时候习惯先算(\tau)和(\rho_s)看一眼数值再决定用哪一族如果(\tau)接近0但有明显尾部依赖就考虑用t-copula的尾部参数去捕捉而不是死磕Gaussian。3. 数据预处理这一步决定了场景生成的成败3.1 功率数据还是气象数据做风光联合场景生成第一步要确定输入数据是功率还是气象要素。两种我都试过结论比较明确如果目标是做电力调度、储能配置直接用历史功率数据最省事因为功率已经是“结果”包含了机组状态、限电、场站损耗等所有综合因素。如果你想生成的是“未来可能出现的出力场景”而历史功率序列太短或者机组发生过技改导致前后不一致那就得用气象再分析数据风速、辐照度先模拟成功率再做copula。用气象数据的优点是数据量大、空间分辨率高能够覆盖更多极端场景缺点是功率转换模型风速-功率曲线、辐照-功率模型本身就有误差而且气象数据的时间分辨率和空间尺度与场站实际出力不完全匹配。我的经验是有历史功率数据优先用功率没有再用气象数据。另外要注意数据的时间分辨率。做日前调度用的小时级场景数据至少要有1年最好是2-3年做日内滚动优化用15分钟级场景建议数据长度不少于3个月。数据太短时极端相关结构根本暴露不出来。3.2 时序对齐与滞后相关性处理风电和光伏对天气的响应时间不同。风速变化到场站出力变化可能只需要几十分钟而云层移动影响光伏出力可能只需要几分钟。如果你用的是15分钟级数据风功率和光伏功率之间可能存在时间错位比如当前时刻的光伏出力与15分钟前的风速相关性更高。处理这个问题有个简单办法计算互相关函数遍历不同的时间滞后(lag)找到相关系数绝对值最大的滞后阶数然后做时间对齐。from scipy.signal import correlate def find_optimal_lag(wind_series, pv_series, max_lag24): 找出使风电-光伏相关性最强的时滞单位采样点 corrs [] for lag in range(-max_lag, max_lag 1): if lag 0: w wind_series[:-lag] if lag else wind_series v pv_series[lag:] else: w wind_series[-lag:] v pv_series[:lag] if len(w) 2: corrs.append(np.nan) continue corrs.append(np.corrcoef(w, v)[0, 1]) lags list(range(-max_lag, max_lag 1)) best_lag lags[int(np.nanargmax(np.abs(corrs)))] return best_lag, corrs我处理过的某个山东项目数据风速领先光伏出力1个采样点15分钟时相关性最强这可能与当地天气系统移动方向、云层滞后有关。对齐之后再做copula拟合尾部分布明显更合理。3.3 缺失值与异常值处理风电场的功率数据经常有缺失原因包括通讯中断、机组检修、限电等。光伏电站则容易出现零出力时段尤其是在夜间。处理时要注意夜间零出力不要直接删除。夜间光伏出力为零是确定性的物理事实不包含相关结构信息。把这些零值硬塞进copula拟合会严重拉低伪观测值的分布质量导致生成的场景在夜间出现光伏小正出力。建议的做法是建模时只使用日照时段如当地日出后30分钟到日落前30分钟的数据生成场景后再对夜间强制置零。限电时段要标记出来。如果某风电场因为调度指令限制出力实际功率明显低于可用功率这段时间的数据不反映真实的风资源状况copula拟合时会扭曲相关结构。建议用运维记录把这些时段挑出来剔除或者用相邻时段插值补齐。异常尖峰数据。SCADA系统偶尔会记录到功率突然跳变又恢复的尖峰通常是通讯误码或传感器故障。这类点对Pearson相关系数影响很大对秩相关系数影响较小但依然建议做一次3σ或四分位距的离群值检测结合现场日志确认是否为真实事件。实操中我的原则是先清洗、再对齐、最后做伪观测值变换。顺序反了后面的所有结果都要打折扣。4. 从copula到风光联合场景生成完整实操流程4.1 整体流程梳理整个场景生成流程可以拆成五步数据清洗与时间对齐上一节内容对风功率、光伏功率分别做边缘分布建模得到各自的累积分布函数把历史数据通过边缘CDF变换成均匀分布伪观测值再拟合适用的copula从copula采样得到大样本联合场景通常是均匀分布空间再通过逆变换回功率空间对场景做缩减或后处理形成调度模型可用的典型场景集这里面第2步边缘分布建模很容易被忽略但对结果影响很大。很多教程直接经验分布一用到底有(n)个样本就有(n)个阶梯段生成场景时会遭遇严重的“分箱效应”场景值只能在历史观测值附近跳动无法产生新的、合理的中间值。4.2 边缘分布建模对风功率我常用beta分布或混合分布。风功率数据在0附近和额定功率附近都有集中趋势单峰分布很难拟合。可以构造一个0膨胀系数加beta分布的混合模型[ F_W(w) \pi_0 \cdot \mathbf{1}{w0} (1-\pi_0-\pi_1) \cdot B{a,b}(w) \pi_1 \cdot \mathbf{1}{wW{rated}} ]其中(\pi_0)是零出力概率(\pi_1)是满发概率中间段用beta分布拟合。这样既保留了边界点的集中又能灵活拟合中间段。对光伏功率我习惯用**核密度估计KDE**或带边界修正的beta分布。光伏功率的典型特征是上午爬坡、下午下坡整体分布右偏最大值受装机容量限制。如果直接用普通KDE在0和额定容量边界会出现泄漏密度越过边界建议用反射核密度或对数据先做logit变换。logit变换虽然听起来复杂实现起来就是一行from scipy.stats import beta, kde # 光伏功率归一化到 [0, 1] p_norm pv_power / pv_capacity # 方式1: beta分布拟合 a, b, loc, scale beta.fit(p_norm, floc0, fscale1) # 方式2: 对logit变换后的数据做KDE from scipy.special import logit, expit eps 1e-6 p_clip np.clip(p_norm, eps, 1 - eps) z logit(p_clip) kde_z kde.gaussian_kde(z) # 采样时先采z再用expit逆变换回功率空间我个人建议如果历史数据量足够2000个有效样本KDE的拟合效果通常优于参数分布如果数据量少beta分布更稳。风功率因为有0和满发两个边界聚集0膨胀混合beta分布更合适。4.3 MATLAB完整示例下面是我在实际项目中用的MATLAB代码骨架已经被我简化过保留了核心逻辑%% 1. 数据准备 % wind_data, pv_data: 列向量单位 MW已清洗并对齐 % 只保留白天时段按当地日照判断 daytime_idx pv_data 0.01 * pv_capacity; w wind_data(daytime_idx); v pv_data(daytime_idx); %% 2. 边缘分布 - 伪观测值 % 用经验CDF转换分母用 n1 n length(w); u_w tiedrank(w) / (n 1); u_v tiedrank(v) / (n 1); U [u_w, u_v]; %% 3. 拟合copula rho_gauss copulafit(Gaussian, U); [rho_t, nu_t] copulafit(t, U); param_clayton copulafit(Clayton, U); param_gumbel copulafit(Gumbel, U); % 用AIC选最优 [nll_gauss, ~] copulalognll(Gaussian, U, rho_gauss); [nll_t, ~] copulalognll(t, U, [rho_t, nu_t]); [nll_clayton, ~] copulalognll(Clayton, U, param_clayton); [nll_gumbel, ~] copulalognll(Gumbel, U, param_gumbel); aic_gauss 2 * nll_gauss 2 * 1; aic_t 2 * nll_t 2 * 2; aic_clayton 2 * nll_clayton 2 * 1; aic_gumbel 2 * nll_gumbel 2 * 1; % 选择AIC最小的copula假设选中了Gaussian %% 4. 生成联合场景 n_scen 5000; % 从copula采样得到均匀分布空间下的样本 U_sim copularnd(Gaussian, rho_gauss, n_scen); % 逆变换回功率空间 wind_sim icdf_w(U_sim(:, 1)); % 用你拟合的风功率边缘分布逆CDF pv_sim icdf_v(U_sim(:, 2)); % 用你拟合的光伏功率边缘分布逆CDF %% 5. 画图检查 figure; scatter(wind_sim, pv_sim, 10, [0.6 0.6 0.6], filled); hold on; scatter(w, v, 10, r, filled); xlabel(风功率/MW); ylabel(光伏功率/MW); legend(copula生成场景,历史数据);4.4 Python完整示例如果你更习惯Python生态下面是一段对应的实现。我自己的习惯是Python做研究验证、MATLAB做工程复现两边逻辑完全等价import numpy as np from scipy.stats import rankdata, norm, gaussian_kde, beta from copulas.multivariate import GaussianMultivariate # 假设 wind_data, pv_data 已经是清洗后对齐的一维数组 # Step 1: 计算经验分布伪观测值 def pseudo_obs(x): 把样本转换为 (0,1) 区间的伪观测值 return rankdata(x) / (len(x) 1) u np.column_stack([pseudo_obs(wind_data), pseudo_obs(pv_data)]) # Step 2: 多种copula候选以t-copula和高斯为例 from scipy.stats import t as t_dist # 高斯copula直接算正态变换后的相关系数 z norm.ppf(u) rho np.corrcoef(z[:, 0], z[:, 1])[0, 1] # Step 3: 从高斯copula生成样本 n_scen 5000 z_sim np.random.multivariate_normal(mean[0, 0], cov[[1, rho], [rho, 1]], sizen_scen) u_sim norm.cdf(z_sim) # Step 4: 逆变换回功率空间 # 风电边缘分布0膨胀 beta wind_pdf wind_data / wind_capacity # 训练beta分布 a_w, b_w, _, _ beta.fit(wind_pdf[wind_pdf 0.01], floc0, fscale1) pi0 np.mean(wind_pdf 0.01) # 重新组织风电采样先判断是否为0再用beta逆变换 threshold pi0 wind_sim np.zeros(n_scen) mask_zero u_sim[:, 0] threshold wind_sim[~mask_zero] beta.ppf((u_sim[~mask_zero, 0] - threshold) / (1 - threshold), a_w, b_w) # 光伏边缘分布KDE logit逆变换 from scipy.special import logit, expit pv_eps 1e-6 pv_norm np.clip(pv_data / pv_capacity, pv_eps, 1 - pv_eps) pv_kde gaussian_kde(logit(pv_norm)) z_pv_sim pv_kde.resample(n_scen)[0] pv_sim expit(z_pv_sim) * pv_capacity4.5 场景数量怎么定场景数量是个权衡问题。生成5000个场景用于统计分析没问题但直接丢进混合整数规划里求解计算量是灾难。一般做法分两步先生成大量场景2000-10000个然后通过场景缩减得到3-10个典型场景。如果不需要缩减、只是想估计统计特征3000个左右就够了再多边际收益递减如果用于日前优化调度5-10个场景是常见的规模如果用于规划阶段的储能容量优化可以保留20-30个场景。当然具体还要看问题规模场景数翻倍求解时间可能翻几倍甚至更多不是线性增长。5. 场景缩减、评价指标与调度接入5.1 快准狠的场景缩减方法最常用的场景缩减方法是K-means聚类虽然学术上还有更快更复杂的同步回代缩减法fast backward reduction但K-means胜在能直接复现、可解释性强。对二维的日场景我一般直接对每条日曲线做聚类。有一种更贴合调度需求的做法把每条场景的“日电量、峰值、峰值时间、风光相关性”作为特征输入K-means。这样聚类的结果天然会区分出“大风小光日”“小风大光日”“阴雨绵绵日”等典型运行日比直接用原始曲线聚类更符合调度人员的心智模型。聚类完成后每个簇的中心就是代表性场景该簇的样本数量占总样本数的比例就是该场景的概率权重。注意不要直接用簇中心作为唯一场景那样会丢失簇内波动信息更稳的做法是保留簇中心附近的几个代表性样本或者对簇内样本再平均。from sklearn.cluster import KMeans # features: n_scenarios x n_features # 特征可以是日电量、峰值、峰时、以及风光出力相关系数 kmeans KMeans(n_clusters5, random_state42, n_init20).fit(features) prob_weights np.bincount(kmeans.labels_) / len(kmeans.labels_) # 提取每个簇的代表性场景取离簇中心最近的原始场景 representative_scenarios [] for i in range(5): cluster_idx np.where(kmeans.labels_ i)[0] center kmeans.cluster_centers_[i] dist np.linalg.norm(features[cluster_idx] - center, axis1) rep_pos cluster_idx[np.argmin(dist)] representative_scenarios.append(original_scenarios[rep_pos]) # 原始功率曲线5.2 场景质量评价指标场景生成完不是肉眼看看就完事要有量化指标。我自己常用这四个指标定义通过标准统计特征对比生成场景与历史数据的均值、方差、分位数对比各分位点偏差5%秩相关系数对比生成场景的Kendall tau与历史数据的tau对比偏差0.05累积分布密度对比二维经验CDF的Cramér-von Mises距离数值越小越好调度结果偏差用场景集优化出的目标函数值与用真实数据回测的偏差偏差10%第一个指标好理解第二个指标是本文特别重要的验证因为copula建模的核心目标就是还原两变量的相关性。如果生成场景的(\tau)和历史数据差了0.1以上说明copula模型没选对或者边缘分布有问题。第三个指标往往被忽略但它能捕捉到第一个、第二个看不到的问题。比如两个变量边缘分布都拟合得很好、秩相关也几乎一致但高维联合密度分布形状却对不上这种情况只能用二维分布对比来发现。5.3 接入日前优化调度场景生成本身不是终点最终要接入优化模型。我做过的一个微电网日前调度案例目标是最小化日运行成本决策变量是储能充放电功率、与电网交互功率约束包括功率平衡、储能SOC约束、爬坡约束。核心逻辑是把场景概率加权进目标函数[ \min \sum_{s1}^{S} \pi_s \sum_{t1}^{T} \left[ c_{buy} P_{grid,t,s}^{buy} - c_{sell} P_{grid,t,s}^{sell} c_{om} (P_{wind,t,s} P_{pv,t,s}) \right] ]约束中每个场景都有自己的风光出力值储能SOC更新也必须按场景分别跟踪保证所有场景下约束都满足。这时候联合场景的价值就体现出来了独立采样得到的场景组合会导致储能频繁动作、过度充放而相关性正确的联合场景会让调度策略“预判”风光的联动性提前做好储能的充放安排。另外热词里提到的分时电价也是这个模型里的关键变量。当电价高峰和光伏大发时段重合时联合场景可以量化“光伏大发负荷高峰”这一有利场景的概率帮助决策者判断是否需要配置更多光伏或储能来套利。这不只是学术问题直接关系到投资收益测算。5.4 扩展到光伏预测和运维场景场景生成方法不只能用于调度和热词里的超短期光伏功率预测、光伏运维也有很好的结合点。我在做光伏功率预测时会用copula生成未来4小时内的风光联合场景作为预测区间比单变量预测区间更能刻画“风大时云量增多导致光伏下降”这种跨变量不确定性在做电站运维策略分析时用copula场景模拟不同天气模式下光伏组件积灰、透光率下降对发电量的影响辅助制定清洗计划。即使是“光伏组件缺陷识别”“不同类型光伏组件对比”这类设备层面的话题也可以借助copula场景做全生命周期的发电量不确定性评估——不同组件在不同光照和温湿度下的出力相关性结构不同直接影响投资收益的风险度量。场景生成的价值在于它提供了一个统一的不确定性建模工具箱换一个应用场景换一套边缘分布核心框架不变。6. 实操避坑清单与工程经验6.1 常见问题速查表现象可能原因解决方案生成场景里光伏夜间有小正出力边缘分布没有区分昼夜零值处理不当只用白天时段建模夜间强制清零风功率场景出现负值或超过额定值逆变换时边缘CDF参数没设好检查beta分布边界使用截断分布生成场景相关性明显低于历史数据copula选择不当或伪观测值计算错误对比AIC换copula检查秩相关系数极端场景(同时满发、同时零出力)太少高斯copula尾部独立无法刻画极端联动换Clayton/Gumbel/t-copula不同季节混合建模效果差春夏秋冬相关结构差异大分季节建模再按季节概率合并调度结果对场景数极其敏感场景数太少概率权重分布不稳场景数从5逐步加到20观察目标值收敛性6.2 分季节建模的细节风电和光伏的空间相关性随季节变化非常明显。夏季光伏出力普遍较高风功率相对较低相关结构相对稳定冬季寒潮天气里大风和晴空往往同时出现相关结构更复杂。如果一整年数据揉在一起拟合一个copula得到的其实是个“平均相关结构”两头都不讨好。我的标准做法是按春夏秋冬四季分别拟合copula生成场景时先按季节概率可以简单按月历比例随机选择季节模型再从中采样。如果数据量足够更精细的做法是按月份拟合12个copula模型。代价是计算量增大但换来的是场景质量的显著提升尤其在极端天气频发的地区。6.3 数据量不足时的备选方案如果只有3-6个月的历史数据分季节建模会导致每个季节的样本量不足。这时候可以考虑用再分析气象数据扩展样本。ECMWF的ERA5再分析数据是免费的可以提供长期的风速和辐照度数据。你可以用当地的风速-功率曲线和光伏阵列模型将气象数据转换成模拟功率数据再做copula拟合。但要注意再分析数据是网格化的空间分辨率通常是27公里左右对局地微气候的表达可能不够准确。如果场站周边地形复杂比如山地、河谷模拟功率和实际功率的相关结构可能会有偏差。这种情况下建议将再分析数据生成的场景限制在建模环节最后用实际功率数据做一次可靠性校验。6.4 关于计算效率的一点经验最后的最后给一个比较实用的经验copula拟合和采样本身计算量不大瓶颈通常在场景生成后的优化求解上。如果场景数从10个增加到20个混合整数规划的求解时间可能增长5-10倍这时候不要盲目追求场景数量而应该在场景质量和求解时间之间找平衡。我做储能配置时试过几种规模的对比5个场景的求解结果和20个场景相比储能容量误差约8%但求解时间差了近15倍。对规划类问题5-10个场景完全够用对运行类问题可能需要20个左右但可以通过场景分解、Benders分解等方法加速求解。这个坑踩多了之后我现在拿到项目的第一个动作不是写代码而是先问清楚决策场景和可接受的求解时间再回过头来定场景数量。

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

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

免费获取报价