新能源出力不确定性建模:蒙特卡洛场景生成与时序相关性削减实战
做新能源出力不确定性的建模与优化绕不开一个基础问题如何把未来可能出现的各种情况变成计算机能算的有限组场景。这个需求在电力系统里特别常见风电、光伏出力全天候波动储能要在事前做好充放电计划调度在决策起点就要面对一条看不清的未来时间轴。于是MC场景生成与削减成了标配工具链。MC就是蒙特卡洛核心思路是用大量随机路径去逼近真实概率分布生成之后再把这些路径压缩成十几条带权重的代表场景这一步叫削减。但真正动手做过的人会承认这条链路里处处是坑。尤其时序相关性这一关既不写在菜鸟示例里又是决定最终结果是否可用的分水岭。这篇文章我按自己实际做过的项目经验来拆从为什么必须考虑时序相关性到蒙特卡洛生成的数学骨架再到削减算法怎么选、时序特征怎么保最后给一个完整的工程复盘。不论你是刚接触场景法的学生还是已经在做随机优化配置的工程师应该都能从中拿走几条能直接用的经验。1. 为什么时序相关性是场景生成的隐藏命门1.1 一次统计指标全对但结果全错的踩坑经历我第一次认认真真做风电和储能的容量配置时还没有意识到时序相关性这个问题。当时的思路很直接把风电场历史出力数据拟合成威布尔分布每个时段独立抽样生成10000条24小时序列。统计指标和原始数据几乎一模一样均值、方差、各时段箱线图都对得上削减去重后留下10个典型场景整套工作看起来漂亮极了。结果优化出来的储能充放电策略简直没法看储能系统几乎每15分钟就切换一次充放电状态完全不像真实系统会做的运行决策。后来我逐条检查生成的场景才意识到问题所在——独立抽样生成的风速序列完全没有记忆t时刻风速和t-1时刻风速之间没有任何依赖关系。真实风速是一个有强烈惯性的过程早上起风后不会在下一个小时突然塌成静风但独立抽样出来的序列前一小时还是大风、下一小时可能就变成零这种神经质跳变在现实里根本不会出现。优化模型可不知道场景是假的。它把这些跳变当成真实的未来不确定性于是理所当然地认为储能必须采用极高频率的响应才能平衡这些剧烈波动。最后的结果就是策略失真、容量配置偏大。复盘之后我才明白统计均值方差对得上只是表象动态特性完全不对才是致命的。1.2 时序相关性的两层含义自相关与互相关把问题看透了之后考虑时序相关性的MC场景生成这个说法里的时序相关性其实包含两层含义任何一层没处理好都会出错。第一层是单序列的自相关性描述的是一个随机过程自己和自己在不同时刻之间的关系。风力的持续效应、光照随早晚的变化规律、负荷的日内双峰特性这些都是典型的自相关。用数学语言说序列x在时间差k处的相关系数ρ(k)不应该全是0。对于风速来说k1小时的自相关系数常常高达0.85以上k24小时还能看到明显的日周期性。第二层是多序列之间的互相关性。两个相邻风电场的出力可能同时偏高或同时偏低这是空间上的耦合风电和光伏往往在白天形成互补这是时间尺度上的耦合冷负荷和气温通常负相关这是物理机理带来的联系。如果只关注每条序列的边际分布而忽略它们之间的协方差结构联合生成的场景就会出现系统性失真。这里有一个非常关键的理解蒙特卡洛本质上只是一个按分布抽样的工具它能保证样本统计特征逼近目标分布但如果你喂给它的随机数生成过程没有内置时序依赖那么无论抽多少次样本得到的都只是边际分布正确、动态特性错误的伪场景。均值方差检验能通过但自相关函数图很难看。1.3 忽略时序相关性的三个典型代价时序相关性一旦丢了损失不只是几条曲线形态变差而是会一路传导到下游的每一项分析。第一个代价是场景概率失真。每条场景被赋予权重但权重再均衡也不能代表真实的状态转移概率。举个例子连续三天大风这种持续性事件在真实气象中并不罕见但在无记忆的独立抽样里概率低得可怜。拿这样的场景集去做生产模拟系统会系统性低估持续高风电带来的消纳压力。第二个代价是优化结果偏离实际。忽略爬坡相关性会低估系统对爬坡能力的需求忽略风光互补性则会让储能被过度配置或者配置不足。这两种误差方向相反新手容易以为可以互相抵消但其实它们同时存在且互相缠绕最后得到的容量配置往往既不是最省的也不是最稳的。第三个代价更隐蔽后面用的削减算法如果是基于逐点距离的聚类它会进一步把动态模式洗成均值路径极端持续事件的概率被二次压缩。这个问题我放在第4章展开因为它值得单独拿出来讲。2. 蒙特卡洛场景生成的数学骨架与实操流程2.1 推荐基准模型AR类模型打底做场景生成我不建议一上来就上复杂模型。对风电、光伏、负荷这类过程AR(1)到AR(3)基本就能抓住主要的自相关结构更高阶的增量收益非常有限。AR(p)模型的写法是x_t c φ1 * x_{t-1} φ2 * x_{t-2} ... φp * x_{t-p} ε_t其中ε_t是均值为零、方差固定的白噪声序列。这个式子的直观意思是当前时刻的值由前面p个时刻的观测值加上一个随机扰动来解释。φ系数衡量记忆强度φ越大序列的惯性就越强。工程上拟合AR模型并不难用Python环境里的statsmodels工具把历史数据传进去模型会自动给出参数估计和残差检验结果。但有一点必须强调时间粒度变了模型必须重新拟合。15分钟级的自相关结构和小时级的自相关结构完全不同不能拿小时级模型套到15分钟级数据上。2.2 多维互相关的数学处理Cholesky分解单条序列用AR模型就够但很多时候要联合生成风、光、负荷等多条时序路径。这时需要一个重要工具Cholesky分解。操作路径是这样的从历史数据估计变量之间的协方差矩阵Σ对Σ做Cholesky分解得到下三角矩阵L满足Σ L·L^T生成独立标准正态随机向量z计算x μ L·z。为什么这么算因为线性变换的协方差规则是Cov(Lz) L·Cov(z)·L^T而Cov(z)是单位阵所以L·I·L^T L·L^T Σ。这个操作本质上把独立白噪声组合成了带指定相关结构的信号。用生活化的方式理解可以把Cholesky分解想象成一次调音混音几个独立音轨本身没问题但直接用它们混出来的曲子毫无协调感Cholesky分解相当于给每一条音轨算好了混音比例混出来才有层次。变量之间的相关性就是这样被混进去的。2.3 残差bootstrap保住非高斯尾巴很多教程到这里就停了但我强烈建议在AR模型之后加一步残差bootstrap。原因是AR模型假设残差服从正态分布生成出来的序列天然只在均值附近波动这会明显低估极端事件的发生概率。做法非常简单拟合AR模型后把残差序列收集起来。真正生成场景时不从正态分布采样扰动而是每次从残差经验分布里随机抽取一个值回填。这样生成的序列会保留原始数据中那种偶发的、幅度不均匀的大波动。打个比方正态扰动生成的场景像规规矩矩的上班族每天通勤路线高度一致残差bootstrap生成的场景更像真实社会偶尔有人迟到早退甚至突然请假正是这些偶然事件决定了系统冗余该配多大。对电力系统来说这个冗余就是储能容量和备用容量。2.4 场景生成流程的完整清单把上面的内容串起来一个标准的单条时序场景生成流程长这样数据预处理剔除物理上不可能的出力点识别连续缺失段统一重采样到目标时间粒度。平稳化与标准化如果数据有季节趋势先做差分或移动平均去趋势如果是出力比例数据建议做logit变换把[0,1]映射到实数域避免边缘堆挤。模型拟合拟合AR(p)做残差白噪声检验检验不过就提升阶数或者换ARMA。蒙特卡洛采样用拟合好的模型迭代生成指定数量路径起点从历史值当中有放回抽取。多元耦合如果有多条序列用Cholesky分解建立互相关再分别进入各自的时序模型。逆变换与后处理把标准化数据变换回原始物理量做物理合理性截断比如光伏出力不能为负、风电出力不能超过装机容量。这套流程跑完才配叫考虑时序相关性的MC场景生成。3. 场景削减从几千条路径到十个典型场景的关键机制3.1 为什么必须削减计算复杂度是现实的硬约束假设MC生成了10000个场景每个场景覆盖24小时那么随机优化问题的变量规模是所有时间步和所有场景的乘积。混合整数规划尤其害怕场景数膨胀我的实际经验是场景数从10涨到100求解时间经常从几秒涨到几十分钟甚至直接算不动。所以削减的本质是在尽量保留原始场景集概率信息的前提下用明显更少的带权场景替代它。评价削减方法好不好不是看曲线长得像不像而是看削减前后的概率分布差异是否足够小。3.2 概率距离度量Wasserstein距离为什么是标准选择削减算法需要一个损失函数用来衡量删掉某些场景后整个集合的失真程度这就是概率距离度量。在众多度量里Wasserstein距离也叫推土机距离是理论和工程上都最常用的选择。它的直观意义可以这样理解把一堆沙子从一个分布的位置搬到另一个分布的位置沙子每移动单位距离就要花一份成本Wasserstein距离就是完成全部搬运的最小总成本。这个度量对分布的形状和尾部结构都很敏感而不仅仅是比较均值和方差这一点对极端事件保真至关重要。在离散场景集场景下Wasserstein距离的计算会退化成问题如果被删除的场景x要由保留场景y代表那么搬运成本就是距离d(x,y)削减的总目标就是让所有被删场景的加权搬运成本最小。3.3 三种主流削减算法快速前向选择、后向消除与聚类法目前工程里最常见的三种做法快速前向选择是从空集合出发每次挑选一个最能代表剩余场景的场景加入集合直到达到目标数量。优点是快、直观缺点是贪心算法容易锁定次优路径。后向消除也叫同步回代削减的原型从完整集合出发每次找出一个场景使删除它引起的概率距离增量最小然后把它删掉。我认为这是最稳健的默认选项原因在后面详细讲。K-means聚类法把场景看作高维点做聚类用聚类中心作为新场景。它的问题是会产生虚拟场景而不是原始数据中的真实场景极端点在平均过程里被抹平。如果后续要做的是可靠性分析我一般不建议直接用K-meansK-medoids或加权变体会好一些。我把三种方式的适用场景整理成一个对照表算法输出是否为原始场景计算复杂度时序特征保留推荐场景快速前向选择是低中初步探索、粗筛后向消除是中中通用默认、工程落地K-means聚类否新中心点中低非可靠性分析、快速可视化3.4 概率权重的再分配一个经常被忽略的细节删除一个场景之后它的概率权重必须转移给某个保留场景。这个细节决定削减后的概率分布是否正确但很多实现一带而过。最合理的转移方法找到被删场景在保留场景里的最近邻居把被删权重加到邻居上。保留场景原有权重不动被删场景不进入最终集合。这样一来削减后的所有场景权重之和仍然等于1整体还是一个合法概率分布。这里给一个后向消除的伪代码方便大家理解核心逻辑1. 计算所有场景之间的成对距离矩阵D 2. 初始化每个场景权重为1/N 3. 循环直到场景数达到目标值 - 对每个场景i计算删除i造成的损失 权重_i * min_{j≠i} D[i][j] - 选择损失最小的场景i*作为删除对象 - 找到i*的最近保留邻居j* - 把i*的权重加到j*上 - 从场景集合中移除i* 4. 返回剩余场景和权重。理解了这段伪代码后续想改成带差分惩罚项的增广距离版本也就半小时的事情。4. 时序场景削减的三个深坑与对策4.1 相关性漂移为什么看起来保留了分布却消灭了动态特征削减算法不做时序感知处理几乎必然导致相关性漂移。我遇到过一个极端案例原始场景集中有先高后低和先低后高两类走势非常明显的序列但由于逐点距离更看重整体水平接近这两类都被判为近似于一条中间平直的序列并删掉了削减结果清一色平直。自相关性从原始集合的0.7掉到0.1。对策有两个方向。一个是增量向量拼接把原始序列的24个点扩展成原始点相邻差分值的48维向量再算距离。这样两条序列即使水平位置接近只要变化形态不同距离就会被拉开。另一个是在Wasserstein距离里加上差分项惩罚权重直接比较相邻时刻的变化率差异。4.2 小场景集合的过拟合削减后统计检验必须做场景削减和机器学习里的过拟合很像。削减得到的场景集在原始样本上显得很精确但换一批MC采样再跑一遍结果可能大幅漂移。原因是场景数太少时集合会在某个局部过密恰好捕捉了一小片样本的局部特征。所以我把削减后的统计一致性校验当成强制环节。至少要检查这几项各时段均值绝对误差、各时段标准差绝对误差、整体方差比以及关键分位数误差特别是95%、99%分位和最低值。只有这些指标都控制在可接受范围内场景集才会被送进优化模型。4.3 尾部事件保护怎么让枯风期不被削掉极端场景通常离其它场景都很远而距离削减按贡献度最小原则删除时离群点恰恰是优先被删的对象。这就是尾部事件被洗掉的机制。对新能源出力分析来说这非常致命因为连续枯风、持续高光照这些事件恰恰决定了系统可靠性和储能需求。解决办法是分层削减强制配额先把场景按全天总发电量分位数分成若干桶每个桶内独立削减最后按桶的概率比例确定保留场景数。这样能保证极端场景有最低比例幸存下来。代价是会牺牲一点整体分布贴合度但换来的极端场景完整性对可靠性分析来说很值得。5. 一个完整项目的降本增效复盘5.1 项目背景与数据情况以我之前做的某独立系统风光储联合供电可靠性评估模拟项目为例。系统包含一个风电场、一个光伏电站和一个储能系统需要评估18个月历史出力数据下的供电可靠性核心目标是给储能容量做优化配置。输入是小时级数据大约13000小时。这个数据规模直接把初始场景数定在了5000。如果直接把5000个场景全量送进混合整数规划求解器基本不可能在可接受时间内跑完。5.2 两级削减策略从5000到30的计算成本对比我的方案采用两级削减而不是一步到位第一级标准化数据后用欧式距离的后向消除把5000个场景减到500个。这个阶段计算量不小但用内存优化的距离矩阵算法耗时可以控制在几分钟以内。第二级在500个场景上使用增广距离也就是原始向量加差分向量进一步削到30个。此时距离矩阵只有500乘500计算极快可以放心使用更敏感的距离度量。如果一上来就对5000个场景做动态时间弯曲类的复杂距离单是距离矩阵就需要计算约2500万个距离项每个距离还要在时间维度上动态规划基本跑不动。两级策略相当于先用粗糙距离快速砍掉数量再用精细距离精修代表性。这个思路我后来在好几个时序场景问题里复用效果都很稳定。5.3 校验结果与最终效果削减完成后我做了一整套统计校验各时段出力均值相对误差控制在3%以内95%分位极值相对误差控制在1%以内极端低出力场景在削减后仍然得到保留。校验通过后30个场景被喂进随机优化模型求解时间从全量5000场景时的不可行状态变成了几分钟内完成。5.4 给读者的快速落地清单如果读者想自己实现一套考虑时序相关性的MC场景生成与削减流程我总结了一份可照做的清单先做数据清洗不要跳过物理合理性校验和缺失段识别用AR(p)加残差bootstrap作为默认生成模型多元变量用Cholesky分解建立互相关削减首选后向消除别一上来就调聚类在距离度量里纳入差分项或增广向量避免时序特征被削没削减后必须做统计一致性校验不要只画几张曲线图就认为差不多目标场景数不要拍脑袋按具体分析用途定可靠性分析建议额外保留极端场景配额。我现在做这类研究项目有个固定习惯每生成一版场景集先画出自相关曲线、样本路径和极端事件占比三张诊断图看见异常再继续下游工作绝不让坏场景进入优化模型。这个动作看着简单实际上帮我省掉了大量后期排查的麻烦。时序相关性不是锦上添花而是场景法能不能落地的那道底线值得每一位做随机优化的同行认真对待。

相关新闻

9767张双格式车辆检测数据集:YOLO开箱即训

9767张双格式车辆检测数据集:YOLO开箱即训

简介:本资源是面向计算机视觉初学者与算法工程师的YOLO系列目标检测实战数据集,专为车辆及行人检测任务设计,覆盖公交车、卡车、摩托车、自行车、小型车及行人六类常见交通目标,可直接用于YOLOv5/v7/v8/v9/v10/v11等主流版本的模型…

2026/10/11 22:54:38 阅读更多 →
基于Transformer的手写文本识别:从原理到工程实践

基于Transformer的手写文本识别:从原理到工程实践

简介:基于Transformer架构的手写文本识别系统项目,面向OCR与文档智能识别方向的开发者和研究人员,提供一套免字符分割的端到端序列识别方案。整体采用编码器-解码器结构,运用多头自注意力与二维相对位置编码,配合弹性形…

2026/10/11 22:54:38 阅读更多 →
Beav浏览器AI控制原理剖析:MCP、Native Host与Chrome扩展如何串联成Agent操控链路

Beav浏览器AI控制原理剖析:MCP、Native Host与Chrome扩展如何串联成Agent操控链路

人工智能AI 应用AI 写作媒体生成工作流自动化网页爬虫浏览器控制 【免费下载链接】Beav 小红书 AI 运营工作台|小红书采集、评论区下载、素材库、选题、AI写作、小红书全域解决方案,开箱即用,一键安装,小红书AI工作台,…

2026/10/11 22:54:38 阅读更多 →

最新新闻

窗口函数 SUM() OVER() 详解:PARTITION BY 与 ORDER BY 的累计计算逻辑

窗口函数 SUM() OVER() 详解:PARTITION BY 与 ORDER BY 的累计计算逻辑

很多人学了窗口函数,一看到SUM() OVER(PARTITION BY ... ORDER BY ...)这种写法还是会懵,特别是ORDER BY加上之后,结果怎么就从“分组总和”变成“累加值”了?这篇文章继续走实战路线,我会把SUM() OVER()从基础语法到进…

2026/10/11 23:40:47 阅读更多 →
数据库课程设计:电力收费系统表结构、触发器与存储过程全解析

数据库课程设计:电力收费系统表结构、触发器与存储过程全解析

简介:《数据库课程设计电力公司收费系统.doc》是一份完整的数据库课程设计报告,面向高校计算机、软件工程等专业学生,适用于电力公司收费管理信息系统设计课题。文档围绕客户、用电类型、员工、用电信息、费用管理、收费登记六大核心数据表展…

2026/10/11 23:40:47 阅读更多 →
JMeter+InfluxDB+Grafana:搭建性能测试实时监控看板

JMeter+InfluxDB+Grafana:搭建性能测试实时监控看板

做性能测试的人基本都经历过这样的场景:JMeter压着压着,突然想知道当前的TPS到底有没有掉链子,响应时间的曲线是不是已经拐头向上,可日志刷得太快根本看不出来。一开始我也用JMeter自带的监听器,结果压测刚跑几分钟&am…

2026/10/11 23:40:47 阅读更多 →
内网安全评估:揭秘ACL权限滥用与横向移动链路

内网安全评估:揭秘ACL权限滥用与横向移动链路

内网安全评估做到第三周的时候,我在一份共享文件夹的ACL导出清单里看到了一个非常扎眼的组名:SHARE MODERATORS。这个组在域里并不显眼,不在本地管理员组,也不在任何域管理组里,可它的权限范围却覆盖了全公司的核心共享…

2026/10/11 23:40:47 阅读更多 →
同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建:多商户入驻与智能派单方案详解同城家政行业早已从单一门店自营模式,转向多商户平台化联营发展。平台整合全城多家家政公司、个体服务商、持证服务师傅,统一承接用户订单,通过智能调度完成订单分发与履约。相…

2026/10/11 23:39:46 阅读更多 →
PDF加密权限解除实战:用qpdf免费命令行一键解锁

PDF加密权限解除实战:用qpdf免费命令行一键解锁

上周同事甩过来一个PDF,说打印店打不了,让我帮忙看看。我一看,文件本身没坏,是加了权限限制——允许查看,但打印和复制都被锁了。这种问题我一年能遇到几十次:文档在手机上看一点毛病没有,真要用…

2026/10/11 23:39:46 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →