风电场风速建模:两参数威布尔分布原理与MATLAB实现

简介:这份MATLAB小程序面向风能行业工程师、风电项目研究者及学习风速统计建模的学生,用于对风电场实测风速数据进行两参数威布尔分布拟合与参数估计。压缩包内共1个文件,为weibull1.m脚本,体积约436B,可直接在MATLAB环境中运行,完成数据预处理、形状因子k与尺度参数λ的估计、分布拟合优度评估、风速直方图与威布尔曲线对比绘制,以及平均风速、标准差、湍流强度等特征值计算,为风电场功率预测、风险评估与设备选型提供统计依据。目前已有6233人学习下载,说明该脚本在风速分布分析场景中具有较高的参考价值。读者可借助这份轻量脚本快速理解威布尔分布的实现流程,掌握从样本数据到分布曲线的完整分析思路,并在此基础上修改适配自己的风速数据集,提升风电项目统计分析的效率与可靠性。

1. 风电场风速建模:为什么两参数威布尔分布成了行业默认解

风速数据看起来就是一条随时间抖动的曲线,但真正做过风资源评估的人都知道,这条曲线背后藏着一个统计规律——绝大多数风电场的风速分布,都能被两参数威布尔分布拟合得相当好。这不是巧合,而是大气边界层湍流统计特性决定的。搞懂这个分布为什么能 work、参数怎么估、MATLAB 里怎么落地,比单纯会调一个拟合函数重要得多。

很多人第一次接触威布尔分布,是在风功率计算或发电量估算的场景里。你手上有一年的测风塔数据,每 10 分钟一个点,几万个样本,直接拿去做积分不现实,也不具备外推能力。这时候需要用一个解析分布去概括风速的统计行为,而两参数威布尔分布恰好只需要形状参数 k 和尺度参数 c 两个量,就能把整条风速概率密度曲线描述清楚。k 控制曲线的胖瘦和偏斜,c 控制整体量级,物理意义明确,拟合也不复杂。这就是它成为行业默认解的核心原因:参数少、拟合稳、外推合理。

但默认解不等于随便用。实际项目里,k 和 c 的估计方法不同,结果可能差出好几个百分点的发电量。极大似然、矩估计、最小二乘、WAsP 方法各有适用场景,选错了在平坦地形可能看不出问题,到了复杂地形就会翻车。这份 MATLAB 小程序的价值就在于,它把两参数威布尔分布的参数估计、拟合优度检验和可视化串成了一条完整链路,让你能直接跑通从原始风速序列到分布参数的流程,而不是停留在公式层面。

2. 两参数威布尔分布的数学机制:k 和 c 到底在控制什么

2.1 概率密度函数与累积分布函数的物理含义

两参数威布尔分布的概率密度函数写作:

f(v) = (k/c) * (v/c)^(k-1) * exp(-(v/c)^k)

其中 v 是风速,k 是形状参数,c 是尺度参数。这个式子看起来简单,但每一项都有明确的物理对应。c 的量纲和风速一致,它决定了分布的整体尺度——当 v = c 时,累积概率恰好达到 1 - 1/e,约 63.2%。换句话说,c 是风速分布的一个特征值,接近但不等于平均风速。k 则决定了分布的形状:k = 1 时退化为指数分布,k = 2 时是瑞利分布,k 大于 2 时曲线变得更窄更对称,k 小于 2 时尾部拖得更长。

风电场实测数据里,k 通常在 1.5 到 3.0 之间,c 在 5 到 12 m/s 之间。k 偏小意味着风速波动大,低风速和高风速出现的概率都比中间段高;k 偏大意味着风速集中在某个区间,对风机选型和发电量估算的影响完全不同。累积分布函数 F(v) = 1 - exp(-(v/c)^k) 则直接给出了风速小于某个值的概率,这在计算可利用小时数时非常关键。

2.2 参数估计的四种方法及其差异

参数估计是威布尔分布应用里最容易出分歧的环节。常见的做法有四种:

第一种是极大似然估计。它通过最大化似然函数来求解 k 和 c,理论上在大样本下最优,但需要迭代求解,对初值敏感。第二种是矩估计,用样本均值和方差反推 k 和 c,计算快但精度一般,尤其在样本量小的时候偏差明显。第三种是最小二乘拟合,先把经验累积分布算出来,再做线性化变换,用最小二乘回归求参数,实现简单但受分组方式影响大。第四种是 WAsP 方法,专门针对风资源评估设计,对低风速段做了修正,在欧洲风电场数据上表现稳定。

这四种方法在同一组数据上给出的 k 和 c 可能相差 5% 到 15%,对应的年发电量估算差异可能超过 3%。所以这份 MATLAB 小程序如果同时实现了多种估计方法并给出对比,那它的实用价值就远不止“跑通”而已。

2.3 拟合优度检验:怎么判断威布尔分布适不适合这组数据

拟合完参数不代表就能直接用。风速分布是否真的服从威布尔分布,需要用拟合优度检验来判断。常用的指标有三个:决定系数 R²、均方根误差 RMSE 和 Kolmogorov-Smirnov 检验统计量。R² 越接近 1 越好,RMSE 越小越好,KS 统计量则用来判断经验分布和理论分布之间的最大偏差是否显著。

在 MATLAB 里,这些检验都可以基于经验累积分布和理论累积分布直接计算。关键是要把风速数据先做分组统计,得到每个风速区间的频率,再和理论概率密度做对比。如果 R² 低于 0.95 或者 KS 检验拒绝原假设,那就要考虑是不是数据本身有问题,比如测风塔高度不够、数据缺失太多,或者该地区风速分布本身就不适合用两参数威布尔描述。

3. MATLAB 实现链路:从原始风速序列到分布参数

3.1 数据预处理与风速序列的读取

实际拿到的风速数据往往是时间序列,可能包含缺失值、异常值和不同时间分辨率的记录。在 MATLAB 里,第一步是把数据读进来并做清洗。常见的做法是用 readtable 读取 CSV 或 Excel 文件,然后对风速列做缺失值剔除和范围筛选。

% 读取风速数据,假设文件包含时间戳和风速两列 data = readtable('wind_speed.csv'); v = data.wind_speed; % 剔除缺失值和异常值(风速为负或超过 40 m/s 视为异常) v(isnan(v)) = []; v(v < 0 | v > 40) = []; % 统计基本量 mean_v = mean(v); std_v = std(v); fprintf('样本数: %d, 平均风速: %.2f m/s, 标准差: %.2f m/s\n', ... length(v), mean_v, std_v);

这段代码做了三件事:读取数据、清洗异常值、输出基本统计量。注意风速上限设为 40 m/s 是一个经验值,实际项目里要根据当地气候条件调整。如果测风塔位于台风影响区域,上限可能要放到 50 m/s 以上。数据清洗不彻底,后面拟合出来的参数就是错的,这是最常见的翻车点之一。

3.2 极大似然估计的 MATLAB 实现

极大似然估计是这份小程序的核心算法之一。MATLAB 的统计工具箱里有 wblfit 函数可以直接用,但理解它的内部逻辑对排查问题很有帮助。wblfit 本质上是在对数似然函数上做优化,求解使似然函数最大的 k 和 c。

% 使用 wblfit 做极大似然估计 [param_hat, ci] = wblfit(v); % param_hat(1) 是尺度参数 c,param_hat(2) 是形状参数 k c_mle = param_hat(1); k_mle = param_hat(2); fprintf('极大似然估计: c = %.4f, k = %.4f\n', c_mle, k_mle); fprintf('95%% 置信区间: c [%.4f, %.4f], k [%.4f, %.4f]\n', ... ci(1,1), ci(1,2), ci(2,1), ci(2,2));

wblfit 返回的 param_hat 第一个元素是尺度参数,第二个是形状参数,这个顺序容易记反。置信区间 ci 是一个 2×2 矩阵,第一行对应 c,第二行对应 k。如果置信区间过宽,说明样本量不足或者数据波动太大,这时候拟合结果的可信度就要打折扣。我一般会检查置信区间宽度是否超过估计值的 20%,超过的话就会考虑增加数据量或者换用其他估计方法做交叉验证。

3.3 最小二乘拟合与经验累积分布

最小二乘拟合的思路是把威布尔累积分布函数做两次对数变换,变成线性形式,然后用多项式拟合求参数。具体来说,对 F(v) = 1 - exp(-(v/c)^k) 做变换后得到:

ln(-ln(1 - F(v))) = k * ln(v) - k * ln(c)

这样就把问题转化成了线性回归。在 MATLAB 里可以这样实现:

% 计算经验累积分布 v_sorted = sort(v); n = length(v_sorted); F_emp = (1:n)' / (n + 1); % 中位秩公式 % 线性化变换 x = log(v_sorted); y = log(-log(1 - F_emp)); % 线性拟合 p = polyfit(x, y, 1); k_ls = p(1); c_ls = exp(-p(2) / k_ls); fprintf('最小二乘估计: c = %.4f, k = %.4f\n', c_ls, k_ls);

这里用 (1:n)/(n+1) 而不是 (1:n)/n 来计算经验累积概率,是为了避免 F = 1 导致 log 无穷大。这个细节在很多教程里被忽略,但实际跑代码时如果用了 (1:n)/n,最后几个点会直接报错。polyfit 拟合出来的斜率就是 k,截距是 -k*ln(c),反推就能得到 c。最小二乘的优点是计算快、不需要迭代,缺点是低风速段和高速段的权重被拉平了,拟合结果对中间段更敏感。

3.4 拟合优度检验与可视化

参数估计完之后,必须做拟合优度检验。最直观的方式是把经验累积分布和理论累积分布画在同一张图上,看两条曲线是否贴合。

% 理论累积分布 F_theory = 1 - exp(-(v_sorted / c_mle).^k_mle); % 计算 R² 和 RMSE SS_res = sum((F_emp - F_theory).^2); SS_tot = sum((F_emp - mean(F_emp)).^2); R2 = 1 - SS_res / SS_tot; RMSE = sqrt(mean((F_emp - F_theory).^2)); fprintf('R² = %.4f, RMSE = %.4f\n', R2, RMSE); % 绘图对比 figure; plot(v_sorted, F_emp, 'b-', 'LineWidth', 1.5); hold on; plot(v_sorted, F_theory, 'r--', 'LineWidth', 1.5); xlabel('风速 (m/s)'); ylabel('累积概率'); legend('经验分布', '威布尔拟合'); title(sprintf('威布尔分布拟合 (k=%.3f, c=%.3f)', k_mle, c_mle)); grid on;

R² 高于 0.98 通常说明拟合很好,低于 0.95 就要警惕。RMSE 则要看量级,累积概率的 RMSE 一般在 0.02 以下算合格。如果两条曲线在低风速段偏差明显,可能是数据里低风速样本太多或者测风塔启动风速以下的数据被错误记录。如果高速段偏差大,可能是极端风速样本太少,拟合被中间段主导了。

4. 避坑与排查:风速威布尔拟合里最容易翻车的几个点

4.1 现象:拟合出来的 k 值异常大或异常小

原因:数据里混入了大量零风速或接近零风速的记录。测风塔在静风时段会记录 0 m/s,但威布尔分布的定义域是 v > 0,零值会导致对数变换失效,进而把参数估计带偏。另一个常见原因是数据里混入了不同高度的风速记录,比如 10m 和 70m 的数据混在一起,分布自然对不上。

解决:在预处理阶段把 v ≤ 0.5 m/s 的记录剔除,并且确认所有数据来自同一高度。如果静风时段确实很多,可以考虑用三参数威布尔分布,增加一个位置参数来处理零风速问题。

4.2 现象:极大似然估计不收敛或报错

原因:初值选得不好,或者数据里有极端异常值。wblfit 默认用矩估计给初值,但如果数据分布严重偏斜,初值可能落在局部极值附近,导致迭代不收敛。另外,如果数据里有超过 50 m/s 的记录,似然函数会被这些极端值主导。

解决:先做异常值剔除,再用 wblfit 之前手动指定初值。MATLAB 的 wblfit 支持 'Start' 参数,可以传入一个合理的初值向量。我一般先用矩估计算一个粗略的 k 和 c,再传给 wblfit 做精细优化。

4.3 现象:不同估计方法给出的参数差异很大

原因:样本量不足或者数据分布本身偏离威布尔分布。小样本下,极大似然估计的方差大,最小二乘又受分组方式影响,两者结果自然不一致。如果样本量超过 5000 个点还出现大差异,那就要怀疑数据本身是不是来自两个不同的风况季节。

解决:把数据按季节分组,分别拟合,看参数是否稳定。如果冬季和夏季的 k 值差很多,说明该地区风速分布有明显的季节性,用全年数据拟合会掩盖这个特征。这时候应该分季节建模,而不是强行用一个分布概括全年。

4.4 现象:拟合优度很高但发电量估算偏差大

原因:拟合优度检验的是风速分布,但发电量还取决于风机功率曲线。如果功率曲线的切入风速和额定风速与分布的特征不匹配,即使分布拟合得再好,发电量也会算错。另一个原因是忽略了空气密度修正,高海拔风电场的空气密度低,同样的风速下发电量会少。

解决:把功率曲线和风速分布放在一起做卷积计算,不要只看分布拟合指标。同时确认空气密度是否按实际值修正过。这一步在 MATLAB 里可以用积分或者离散求和实现,关键是不要把两个环节割裂开。

4.5 现象:换一组数据后代码报错

原因:数据格式不一致。有的 CSV 文件用逗号分隔,有的用分号;有的风速列叫 wind_speed,有的叫 speed 或者 v。硬编码列名和分隔符的代码换一组数据就崩。

解决:在读取数据时做格式探测,或者用 readtable 的 'Delimiter' 和 'VariableNamingRule' 参数做兼容。更稳妥的做法是把数据读取和参数估计拆成两个函数,读取函数负责适配不同格式,估计函数只接收清洗后的风速向量。

5. 设计取舍:为什么两参数够用,什么时候该上三参数

两参数威布尔分布之所以成为风电场风速建模的默认选择,本质上是一个工程取舍:它在绝大多数场景下足够准确,同时参数少、拟合稳、外推合理。三参数威布尔分布增加了一个位置参数,能更好地处理零风速和低风速段,但代价是参数估计更复杂,对样本量要求更高,而且位置参数的物理意义不如 k 和 c 直观。

在实际项目里,我一般会先用两参数做基准拟合,检查 R² 和 RMSE。如果低风速段偏差明显,再考虑三参数。但更多时候,问题不在分布本身,而在数据质量和预处理环节。把异常值剔干净、确认数据来自同一高度、分季节检查参数稳定性,这些步骤做到位,两参数威布尔分布的表现通常不会让人失望。

这份 MATLAB 小程序把参数估计、拟合优度检验和可视化串成了一条链路,适合拿来跑通流程、对比不同估计方法,也适合作为风资源评估的入门工具。代码结构清晰的话,还可以直接替换数据文件做批量处理。需要的话可以下载下来,把里面的估计函数和检验函数拆开看,对照自己的数据跑一遍,比只看公式理解得快得多。

从那以后我每次拿到新的测风数据,都会先跑一遍数据清洗和基本统计,再走威布尔拟合,最后用拟合优度检验卡一道。这个习惯帮我避开了好几次因为数据问题导致的参数翻车。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

桌面端CRM如何重构客户沟通记录与团队跟进效率?

桌面端CRM如何重构客户沟通记录与团队跟进效率?

1. 为什么桌面端优先的CRM依然值得做&#xff1f;先盘一下行业的痛点累积做客户管理的人大概都有种共同的疲惫感&#xff1a;真正有价值的客户对话散落在邮件、微信、电话、线下会议甚至Excel记录里&#xff0c;而传统CRM系统更像一个"数据收集器"&#xff0c;你得在…

2026/10/19 21:23:15 阅读更多 →
Keras API 实战指南:高频层、编译训练与回调详解

Keras API 实战指南:高频层、编译训练与回调详解

Keras API 是 TensorFlow 里用得最频繁的那一层接口&#xff0c;做深度学习的人应该都有体会&#xff1a;不管是几层全连接跑个手写数字识别&#xff0c;还是搞一整套图像分类、文本分类的流程&#xff0c;最后落到代码上基本都是 tf.keras 这套高层 API 在干活。它最大的价值就…

2026/10/19 21:22:13 阅读更多 →
FFmpeg C++关键帧提取:精准IDR帧抽取方案

FFmpeg C++关键帧提取:精准IDR帧抽取方案

简介&#xff1a;本资源是一套基于FFmpeg与C实现的关键帧&#xff08;I帧&#xff09;提取完整工程&#xff0c;面向多媒体开发初学者及音视频方向进阶学习者&#xff0c;解决视频分析、截图、监控报警等场景中精准抽取独立完整帧的技术需求。压缩包共73个文件&#xff0c;含42…

2026/10/19 21:22:13 阅读更多 →

最新新闻

YOLOv8门禁五类目标检测:人包口罩手机工牌全链路实战

YOLOv8门禁五类目标检测:人包口罩手机工牌全链路实战

简介&#xff1a;本资源是一套基于YOLOv8实现的端到端智能门禁系统完整工程&#xff0c;面向计算机、人工智能、自动化等专业本科生及入门级开发者&#xff0c;解决人脸/身份目标检测与门禁控制场景落地难题&#xff0c;特别适合作为毕业设计、课程设计或项目原型快速验证。压缩…

2026/10/19 22:11:48 阅读更多 →
【信息科学与工程学】计算机科学与自动化——第一百三十五篇 开发框架篇 101开发框架对比

【信息科学与工程学】计算机科学与自动化——第一百三十五篇 开发框架篇 101开发框架对比

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

2026/10/19 22:10:46 阅读更多 →
从GPT到DeepSeek:大模型低成本高性能演进与部署实践

从GPT到DeepSeek:大模型低成本高性能演进与部署实践

1. 为什么会突然聊起"低成本高性能"这个话题&#xff1a;算力焦虑背后的真问题这几年的AI圈&#xff0c;有一个很明显的风向变化&#xff1a;前两年大家聊大模型&#xff0c;开口就是参数量、训练算力、榜单分数&#xff1b;到了这两年&#xff0c;聊得最多的变成了单…

2026/10/19 22:10:46 阅读更多 →
BERT情感分析实战:IMDB影评微调与文本分类全解析

BERT情感分析实战:IMDB影评微调与文本分类全解析

简介&#xff1a;基于BERT模型的情感分析项目&#xff0c;旨在对IMDB影评进行正面或负面情感的二分类&#xff0c;面向自然语言处理入门者、课程设计或毕业设计选题的学生&#xff0c;也适合作为NLP教学中的配套实战案例。压缩包体积仅4KB&#xff0c;共包含5个文件&#xff0c…

2026/10/19 22:09:44 阅读更多 →
技术图表设计:从需求拆解到可维护架构图

技术图表设计:从需求拆解到可维护架构图

图表这件事&#xff0c;说难不难&#xff0c;说容易也容易翻车。我见过太多技术方案里&#xff0c;堂堂一个核心链路图&#xff0c;画完没人看得懂&#xff1b;也见过明明逻辑很清楚的一个流程&#xff0c;因为节点堆得太满&#xff0c;评审时被反复追问。后来我把一套叫“diag…

2026/10/19 22:09:44 阅读更多 →
SELinux文件系统标签管理与审计日志联调排查实战指南

SELinux文件系统标签管理与审计日志联调排查实战指南

干了这么多年Linux运维&#xff0c;我见过太多人碰到SELinux就是一套组合拳&#xff1a;先setenforce 0&#xff0c;再改/etc/selinux/config&#xff0c;直接把安全机制摁死。这路子确实省事&#xff0c;但要是服务器被日穿了&#xff0c;连个审计线索都捞不着&#xff0c;那时…

2026/10/19 22:06:39 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介&#xff1a;本资源为电源技术方向的学术研究文档&#xff0c;聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略&#xff0c;面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集&#xff0c;共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →