连续潮流与PV曲线:从IEEE14到IEEE33的MATLAB实现与静态电压稳定分析 在电力系统仿真这个圈子里“连续潮流”和“PV曲线”这两个词基本是和静态电压稳定绑定的。但很多刚接触这块的同学手里拿着程序却不知道背后的原理或者是自己写的时候一跑就崩尤其是从IEEE14这种输电网算例切到IEEE33配电网算例时各种不收敛问题全冒出来了。我自己做电压稳定分析这几年把连续潮流程序从14节点扩展到33节点时踩了不少坑今天这篇就围绕这两个算例把连续潮流的核心逻辑、MATLAB实现细节、PV曲线的判读方法以及最常见的几个报错原因一次讲透。这篇内容适合三类人一是正在做本科毕设或研究生课题、需要快速跑通连续潮流算例的同学二是做配电网规划或新能源接入评估、想用PV曲线求负荷裕度的工程师三是纯粹想把“静态电压稳定”这个概念落到代码和图上理解它到底怎么算出来的读者。我会尽量把每一步为什么这么设计讲清楚而不是丢给你一段能跑但看不懂的代码。1. 连续潮流到底是什么为什么普通潮流算不到鼻点1.1 静态电压稳定与PV曲线的关系静态电压稳定问题说白了就是研究“系统还能带多少负荷不崩”。工程上最常用的手段就是做出PV曲线横轴是负荷功率或负荷增长倍数纵轴是某个关键节点的电压幅值。随着负荷一步步增加节点电压会慢慢下降当曲线走到“鼻点”的时候就是系统能承受的极限负荷过了这个点再想增加负荷电压会急剧跌落系统进入电压失稳状态。PV曲线看着简单但真正用MATLAB去画的时候多数人会先试一个最直接的办法把负荷按比例抬高比如每次增加2%然后跑一次牛顿-拉夫逊潮流记录下电压再继续增加直到潮流不收敛为止。这个方法在负荷较轻的时候确实有效但到了临近极限的地方牛顿法会开始不收敛迭代次数飙升最后直接报“Maximum number of iterations exceeded”。原因不是你的程序写错了而是潮流方程在临界点附近本身就出现了数值困难这一点在1.2节详细展开。我最初带本科生做课程设计时不少同学用这种“硬抬负荷”的方法画PV曲线画出来的曲线一般到某个负荷倍数就断掉了正好缺了最关键的鼻点附近那一段。而连续潮流存在的意义就是解决“普通潮流迭代到临界点算不下去”这个痛点通过引入一个负荷增长参数把原来“解一个点”的问题变成“追踪一整条曲线”的问题从而顺利跨过电压崩溃点甚至能画出鼻点后面的下半支。1.2 牛顿法在临界点失效的数学根源想理解连续潮流的必要性绕不开雅可比矩阵奇异这个坎。常规潮流方程可以写成F(x)0x是节点电压幅值和相角。牛顿法每一步需要求解线性方程组J·Δx-F(x)其中J是潮流方程的雅可比矩阵。当负荷不断增大时系统越来越接近电压崩溃点雅可比矩阵的最小奇异值也越来越趋近于零矩阵从“病态”走向“奇异”。在数学上当负荷达到极限时潮流方程的解存在唯一性和可解性都发生变化雅可比矩阵在鞍结分岔点处奇异用牛顿法迭代时修正量Δx会变得非常大迭代点可能在真解附近来回振荡甚至直接飞到场外。这不是数值计算技巧能轻易修补的而是问题本身的结构导致的。打个比方普通潮流就像是给一个爬山的人一把只能“向上迈步”的尺子快到山顶时他每迈一小步都可能滑下来而连续潮流相当于给他一把可以“贴着山体量弧长”的软尺让他沿着山脊线稳稳走到最高点还能继续下坡。连续潮流的数学本质就是把原来的n个潮流方程扩展到n1个方程多引入一个表示负荷水平的参数λ同时增加一个参数化约束方程。这样扩展后的雅可比矩阵即使在原潮流雅可比矩阵奇异处也可以保持非奇异数值上就能跨过临界点。1.3 连续潮流的破局思路把解方程变成追踪曲线理解了上面的数学背景连续潮流的“破局思路”就很清晰了不要试图直接求解临界点的解而是把负荷参数λ看成变量之一从已知的基态解出发沿着潮流方程的解曲线一步一步追踪每一步都从上一个已知解出发做预测和校正最终描出完整的PV曲线。这里的核心变化是潮流方程从F(x)0变成了F(x, λ)0未知数的个数比方程多一个解构成一条一维曲线。为了能确定性地往前走需要额外加一个参数化方程。不同的参数化方式形成了连续潮流的不同流派最常见的是λ参数化、弧长参数化和局部几何参数化。参数化的选择直接影响程序在不同网络上的稳定性这一块是程序能不能从IEEE14顺利迁移到IEEE33的关键之一下一节详细拆解。2. 连续潮流四个核心环节逐个拆解2.1 参数化决定你走哪条路参数化是整个连续潮流算法的“方向盘”决定了扩展雅可比矩阵里加哪一行。很多公开的连续潮流MATLAB程序默认采用最简单的λ参数化也就是把λ固定为预测值λ_pred然后只求解潮流方程。这种方案在PV曲线的上半支很稳定但当曲线接近鼻点时dλ/ds趋近于零再用λ作为固定参数来校正扩展雅可比矩阵依然会奇异程序大概率在鼻点前就崩掉。我自己的经验是做一个通用性比较好的程序至少要落到弧长参数化或者局部参数化。弧长参数化用曲线弧长s作为参数增加约束方程Σ(dxi/ds)^2(dλ/ds)^21实现上通常会在扩展雅可比矩阵里加入一行与切线方向相关的约束。优点是适应性强能画完整条S形曲线缺点是方程形式稍复杂步长单位不再是纯粹的负荷倍数读图时需要把弧长映射回λ。局部参数化从所有状态变量包括λ中选择变化速率最大的那个作为参数比如在鼻点附近选λ在鼻点附近电压跌落快时选某个节点电压。优点是灵活、实现也不算复杂但需要每步都判断选哪个变量代码逻辑略多。在IEEE14这种输电网里λ参数化大多数情况下勉强够用因为输电网的PV曲线上半支比较长拐点也不算尖锐。但换成IEEE33这种R/X比较大的辐射配电网PV曲线会更“弯”也就是鼻点附近λ方向的变化相对缓慢如果还用λ参数化即使初始步长设得很小也容易在校正迭代时发散。所以我建议直接把弧长参数化或局部参数化作为主程序默认方案一步到位。2.2 预测器下一步往哪走连续潮流每一步开始前需要先预估下一个解的大概位置预测精度越高校正环节需要迭代的次数就越少。工程上最多用的是切线预测和割线预测两种。切线预测需要求扩展雅可比矩阵J_ext然后解一个线性方程组J_ext·t e_k其中e_k是只在参数化方程对应位置为1的单位向量得到的t就是解曲线的切线方向。实际使用时常给切线方向做归一化再乘上步长σ得到预测点的增量。割线预测更简单直接用上一步和这一步的解向量做线性外推形式上不涉及雅可比矩阵计算快但在曲线曲率较大时预测偏差会明显增大。我在程序里默认用切线预测原因是刚度变化大的网络上割线预测容易“跑偏”导致校正环节要迭代很多次甚至发散。切线预测多解一个线性方程的成本完全可以接受而它的精度高很多尤其在接近鼻点时切线方向正好近似于水平能准确预判曲线转弯趋势。2.3 校正器回归真实曲线预测点理论上不在精确解曲线上所以要用牛顿法把点拉回曲线这就是校正环节。校正环节的写法有讲究固定参数化变量再迭代称为垂直校正在新的参数化约束下同时迭代所有变量称为切线校正。垂直校正最简单比如弧长参数化时固定某状态变量为预测值然后用牛顿法解潮流方程。实现难度低但问题在于预测点在某些方向误差较大时垂直校正可能找不到解。切线校正是更稳健的选择它在每个牛顿步内额外引入“解偏离量与切线方向正交”的约束相当于把所有变量拉回一条垂直于预测方向的超平面上再投影到真实曲线。数值上切线校正对初值的要求没那么苛刻我调试IEEE33算例时深有体会用垂直校正在重载区经常振荡换切线校正后基本每步三四次迭代就收敛。校正环节里的另一个细节是残差判据。建议潮流方程残差的2范数默认设在1e-8到1e-10之间太松画出来的曲线毛刺明显太紧会增加迭代次数。如果是给论文用残差阈值设在1e-9比较保险。2.4 步长控制快慢平衡的艺术步长选多少直接影响连续潮流能不能跑完。如果固定步长在曲线平缓段走得慢浪费算力在鼻点附近曲率大步长太大又容易让校正环节丢失收敛域直接发散。我经过多次测试推荐用自适应步长策略初始步长取0.05左右比如代表负荷相对于基态增长5%。每步校正结束后统计牛顿迭代次数如果平均迭代次数小于3次说明这步太保守了下一轮步长放大10%如果超过6次说明步长偏大下一轮步长缩小30%到50%如果迭代次数在4到5次维持步长不变。这个策略在IEEE14和IEEE33两个算例上都跑得过。特别注意IEEE33在重载段对步长非常敏感建议给程序加一个最小步长保护比如当步长小于0.001时强制终止并输出警告否则程序可能陷入无限缩小步长的死循环表面上迭代了一千步但曲线一点没动。3. MATLAB程序实现从14节点到33节点3.1 程序整体架构与MATPOWER数据的配合一个完整的连续潮流MATLAB程序大体由这几部分组成数据准备与算例加载基态潮流计算连续潮流主循环预测、校正、步长控制数据记录与结果绘图如果只打算做研究验证建议用MATPOWER的数据格式来管理网络参数因为case14.m这类文件是现成的自己能减少很多搭数据的麻烦。程序启动时调用case函数读取母线、线路、发电机和负荷数据再构造Y矩阵或直接交给MATPOWER来算基态潮流然后进入自己写的连续潮流主循环。我见过一些新手把连续潮流和MATPOWER的函数绑得太死比如直接用runpf作为在校正环节中的子函数这样写是可以但每步都要重新解析数据和建立稀疏矩阵效率很低尤其是IEEE33这种配电网步子多的时候程序会慢得让人怀疑人生。更推荐的做法是只从MATPOWER的case结构体里拿原始参数自己用稀疏矩阵组装潮流方程和雅可比矩阵连续潮流主循环全用自编函数完成。主循环的伪代码逻辑大致是这样的% 连续潮流主循环示意 x x_base; % 初始状态向量 lambda 1.0; % 基态负荷倍数 ds 0.05; % 初始步长 curve []; % 记录曲线点 while lambda lambda_max ds ds_min % 预测 [dx, dlambda] tangent_predictor(J_ext, param_type, x, lambda); x_pred x ds * dx / norm([dx; dlambda]); lambda_pred lambda ds * dlambda / norm([dx; dlambda]); % 校正 [x_new, lambda_new, iter] corrector(x_pred, lambda_pred); % 步长自适应 ds adjust_step(ds, iter); % 记录结果 curve [curve; lambda_new, x_new]; x x_new; lambda lambda_new; end实际程序还需要处理发电机无功越限、节点类型转换等问题但那属于进一步细化第一版能跑通绘制PV曲线不需要在一开始就全塞进去。我的建议是先做一个“最简可用版”确认算法流程正确再逐项加约束。3.2 IEEE14节点算例输电网络中的验证IEEE14节点是一个小型输电网算例包含5台发电机、20条支路基准电压等级有69kV和13.8kV等全网总负荷在两百多兆瓦量级。它的特点是网络联系比较紧密R/X比值较小雅可比矩阵性质好所以做连续潮流时相对友好特别适合用来验证程序框架和参数化的正确性。在IEEE14上运行连续潮流时有几个判断结果是否合理的检查点第一基态潮流结果应该和MATPOWER的runpf结果一致这是程序自检最基础的一步第二随着λ增加电压最先出现明显下滑的通常是远离发电机且电气距离较远的负荷节点比如14号节点附近第三曲线走到鼻点后继续增加弧长可以进入下半支λ会掉头向下电压继续降低形成完整的S形特征。我建议在14节点算例中就把“节点类型切换”加上也就是当发电机无功到达上限时把该发电机节点从PV节点切换为PQ节点。因为连续潮流跑到重载区时最先触上限的一般是靠近负荷中心的无功支撑机组如果不做类型切换基态用的是PV节点但实际系统在该运行点已经失去了电压支撑能力画出来的PV曲线会过于乐观负荷裕度偏大。IEEE14的发电机配置相对宽松但依然是教学演示PV曲线的好素材。实际跑的时候14号节点和10号节点往往是最薄弱的节点画PV曲线时建议程序自动记录所有PQ节点的电压最后统一绘制选出电压下降最快的一条做主曲线。注意不要只盯着发电机节点看因为PV节点电压被强制钳在设定值附近PV曲线看起来平平的容易掩盖真实的电压稳定风险。3.3 IEEE33节点算例辐射配电网的特殊性IEEE33节点是配电网研究中非常有名的辐射状算例基准电压12.66kV总负荷约3.7MW加2.3MVar共有32条支路呈树状结构。相比IEEE14这个算例对连续潮流算法明显更“不友好”原因有三方面一是R/X比值大线路电阻和电抗接近甚至更大导致潮流方程的非线性更强雅可比矩阵的条件数更差。同样的负荷增长倍数下配电网的电压跌落比输电网剧烈得多鼻点附近的曲线形状也更尖锐。二是配电网通常只有一个根节点作为平衡节点也就是变电站母线没有多个发电机分摊无功全网的无功支撑能力有限重载时很容易出现末端节点电压大幅下降。连续潮流扩展到后半段时要特别注意校正环节的收敛性步长稍微大一点就可能整个程序跳出来报错。三是恒功率负荷模型在低电压环境下会让雅可比矩阵在鼻点附近更容易奇异。如果换成恒阻抗或ZIP负荷模型电压曲线会更平滑一点这说明负荷模型的选择直接决定了负荷裕度的计算结果。我在做33节点算例时恒功率模型下的极限负荷倍数明显小于恒阻抗模型这提醒我们解读结果时一定要说明自己用了什么样的负荷模型。程序从14节点切到33节点最需要注意的调整是初始步长要主动调小。14节点用0.05没问题33节点我建议初始步长从0.02甚至0.01开始。另外基态潮流如果自己写牛顿法初值不要直接用平启动也就是不要把所有电压幅值初始化为1、相角初始化为0因为配电网的电压分布比较低平启动时牛顿法容易振荡或发散。可以先用一次简化的前推回代得到初值或者干脆先用MATPOWER的runpf算出基态解再用这个解作为连续潮流的起点。3.4 PV曲线结果输出与读图程序最终要输出PV曲线但这一步也有一个很容易踩的坑MATLAB的plot函数默认按照数据点的先后顺序连线。如果数据点记录顺序是沿着弧长方向递增的横轴画λ、纵轴画电压大多数情况下没问题曲线是一根平滑的抛物线形。但如果习惯性地画成“横轴电压、纵轴λ”的经典PV曲线样式鼻点之后的数据点对应电压值会反向下降直接按记录顺序连线程序会把上下两支连成交叉的锯齿状折线。解决办法是对鼻点附近的数据点按上下两支分别处理或者按弧长方向用插值重排。我的做法是同时绘制两种图一种横轴是λ方便看负荷裕度另一种横轴是总负荷功率纵轴是电压这是论文中最常见的PV曲线样式。输出第二种图时先把数据按λ从小到大排序得到上半支再按λ从大到小单独绘制下半支两条线在鼻点相交这样曲线才是干净的。另外一个输出细节是程序最好把每一步的λ值、总负荷、各节点电压都记录到结构体或数组里方便后续计算负荷裕度、节点电压跌落速率。不要到最后只留下画图的坐标点因为改图或者扩展分析时原始轨迹数据才是真正有价值的。4. 从PV曲线到静态电压稳定评估4.1 鼻点、负荷裕度与电压稳定判据把PV曲线画出来之后下一步就是定量评估静态电压稳定性。最直接的指标是负荷裕度定义是极限负荷倍率与当前负荷倍率之差。比如基态λ1当连续潮流追踪到鼻点时如果λ_max2.3意味着系统还能承担1.3倍于当前水平的负荷增长负荷裕度就是130%。除了负荷裕度PV曲线还有一个很经典的灵敏度判据在鼻点处dP/dV趋近于无穷大在PV曲线下半支P增加但V降低且同样的负荷水平可能对应两个电压解一般取上半支为稳定解下半支为不稳定解。因此系统运行在鼻点左侧上半支是静态电压稳定区域但裕度大小要依据工程标准判断一般要求负荷裕度不低于10%到20%具体数值取决于电网运行规程。读PV曲线时还要区分“电压崩溃”和“电压过低”两个概念。连续潮流跑到鼻点时系统是因为达到功率传输极限而发生电压崩溃鼻点对应的负荷是极限负荷而电压过低指的是电压幅值已经跌破运行下限比如低于0.9pu这个点可能出现在极限负荷之前。论文里常把这两个点都标在PV曲线上分别给出“电压上限制约的负荷能力”和“崩溃极限负荷”。4.2 薄弱节点识别与曲线排序的坑连续潮流程序在记录数据时记录了全部PQ节点的电压所以画图时可以多选几个节点的曲线叠加。但人工一个个判断哪个节点最薄弱不可取好的做法是程序自动找到“电压跌落最快”的节点。我在程序里写了一个小模块取PV曲线上负荷从基态到接近鼻点这一段计算每个PQ节点电压下降量与λ增量的比值也就是dV/dλ的均值取绝对值最大的节点作为薄弱节点。IEEE14算例中薄弱节点通常在14号、10号和9号之间浮动具体取决于发电机调度方式。IEEE33算例中末端节点比如18号、33号往往是电压最低点。把薄弱节点的曲线高亮显示其他节点曲线用浅色绘制图面会清晰很多。关于曲线排序的问题在4.1节已经提到了这里再强调一次实际操作经验程序里曲线的记录顺序是按弧长方向来的但横轴换成负荷功率后同一横坐标在鼻点附近会对应两个电压解把全部点直接丢给plot连线必乱。要么将曲线拆成上下两支分别绘制要么用更密集的λ步长配合平滑函数。我见过不少人在这一步翻车改判断逻辑只花了十分钟但排查“曲线为什么是锯齿状”花了一晚上。5. 常见问题与排查速查表5.1 高频报错与解决方案一览连续潮流程序的报错与普通潮流程序不太一样错误往往不是语法级而是数值级比如“矩阵接近奇异”或者“牛顿迭代不收敛”这类问题需要结合算法原理来排查。下面把我在IEEE14和IEEE33上运行过程中最常遇到的几类问题整理成表格现象可能原因常用解决手段连续潮流在鼻点前几步就发散参数化方式采用λ参数化扩展雅可比仍奇异切换为弧长参数化或局部参数化校正环节迭代次数大于10次有时直接发散预测点离真实曲线太远步长过大缩小步长或改用切线预测替代割线预测曲线在鼻点附近出现锯齿状折线绘图时直接按记录顺序连线未处理上下支拆分为上、下半支分别绘制IEEE33算例基态都不收敛初值选择不当平启动对配电网太差先用MATPOWER或前推回代计算基态再启动连续潮流负荷裕度结果偏大明显不合理发电机PV节点未考虑无功越限后的类型切换增加节点类型切换逻辑越限后改为PQ节点程序跑得极慢每步步长不断缩小校正环节收敛判据过严或步长自适应策略过于敏感放宽残差阈值降低步长缩小的幅度如果程序报“Matrix is singular”或者“NaN”值优先检查扩展雅可比矩阵的构成行尤其是参数化方程有没有写错。可以临时在预测环节后打印切线方向和各状态变量增量的量级正常情况下应该处于同一数量级如果某几个变量突然变成十的负十几次方或者正几十次方说明参数化方程失效或者求解方向错了。5.2 个人踩坑记录与调试技巧调试连续潮流程序时我最大的心得是“先画一条完整的曲线再优化精度”。不要一上来就追求步长自适应、节点类型切换、负荷模型扩展这些功能先把最简单版本的14节点PV曲线完整跑出来哪怕步长固定0.05、只用λ参数化确认曲线形状合理了再逐项加复杂度。每加一项功能就重跑一次14节点算例确保没有引入新的回归问题。第二个技巧是善用中间结果调试。我会在预测和校正之间临时画一张图把预测点、校正点、上一个已知解用不同颜色标出来。如果校正点来回振荡比如每次都在一个闭环上转圈那基本可以断定是步长太大导致落入了牛顿法的周期性循环这时候调小步长通常能解决。第三个技巧是对照验证。14节点算例跑出的基态潮流要能和MATPOWER完全对上这是数据文件读取和Y矩阵构造正确的基本证明。连续潮流的结果没有现成标准答案但可以用Matpower自带的runpf在某一固定λ值下做交叉验证比如把程序跑到λ2.0时的解作为初值用runpf直接在抬升负荷后的系统上再算一次潮流两个结果应该高度一致。如果对不上说明连续潮流内部的状态更新逻辑有bug。第四个技巧是对IEEE33这类配电网如果初始基态用自己写的牛顿法无法收敛不用死磕。先调用MATPOWER得到基态解再启动连续潮流这是合理的工程方案不影响你对算法的理解也能节省大量调试时间。等程序整体跑通后如果想锻炼自己再回头把牛顿法初值问题解决掉。结尾的个人经验连续潮流程序写到这里其实还只是一个静态电压稳定分析的起点后面可以继续叠加的东西很多比如考虑发电机无功出力极限的节点类型自动切换、ZIP负荷模型、分布式电源接入后的多参数连续潮流以及把PV曲线和灵敏度分析、模态分析结合起来做薄弱节点筛选。我个人在做这个程序时最深的体会是算法框架看起来很成熟但真正让程序稳定可靠的往往是一些不起眼的细节比如步长下限设置、参数化方式选择、绘图数据排序这些恰恰是论文里不会写清楚的部分。如果你正在调这个程序建议从14节点跑通到33节点路上遇到的每一个报错都值得记录下来尤其是校正迭代发散和曲线锯齿这两个问题解决了它们你对连续潮流的理解会上一个台阶。

相关新闻

最新新闻

opencode实战指南:终端AI编程助手的安装、配置与高阶玩法

opencode实战指南:终端AI编程助手的安装、配置与高阶玩法

最近一段时间,终端里的AI编程工具像雨后春笋一样冒出来,Claude Code、Codex CLI、Google的Code-FX、还有今天要聊的opencode,一个比一个卷。如果你平时关注AI编程这块,大概率已经刷到过opencode这个词了,但很多人下载完…

2026/9/8 4:04:31
JetBrains IDEA变身MCP Server:给AI装上眼睛,让它真正看懂Maven项目

JetBrains IDEA变身MCP Server:给AI装上眼睛,让它真正看懂Maven项目

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

2026/9/8 4:04:31
AI助手记忆系统开发:三层记忆架构与跨会话实现

AI助手记忆系统开发:三层记忆架构与跨会话实现

如果你正在开发 AI 助手,大概率遇到过这个尴尬场景:用户上一秒告诉你“我姓陈,做跨境电商的”,下一秒换个话题聊三次,助手就不再记得这回事,又重新问了一遍“请问怎么称呼您”。问题通常不在大模型的能力&a…

2026/9/8 4:04:31
openEuler+鲲鹏平台:Agent Memory记忆管理系统实战指南

openEuler+鲲鹏平台:Agent Memory记忆管理系统实战指南

2026中国国际大学生创新大赛的openEuler命题已经公布,很多团队看到“基于鲲鹏平台的Agent Memory记忆管理系统”这个题目时,第一反应是:这又是一个“大而空”的赛题包装,还是真有一个可以落地的技术方向?先说结论&…

2026/9/8 4:04:31
从散落混乱到统一入口:一套JSON工具类封装方案的设计与难点复盘

从散落混乱到统一入口:一套JSON工具类封装方案的设计与难点复盘

写接口对接的时候,我最怕的不是业务逻辑写错,而是JSON这层皮反反复复出问题——今天这个接口用 new Gson() 解析,明天那个模块自己copy了一段Fastjson,后天又有人在代码里直接操作 JsonObject 取字段。字段一多、调用一多&…

2026/9/8 4:04:31
AIxAgentxData技术栈全解析:从原理到面试实战的学习路线

AIxAgentxData技术栈全解析:从原理到面试实战的学习路线

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

2026/9/8 3:59:31