MATLAB实战:用fitdist函数搞定风光数据Weibull与Beta分布拟合(附完整代码)

张开发
2026/4/17 7:07:09 15 分钟阅读

分享文章

MATLAB实战:用fitdist函数搞定风光数据Weibull与Beta分布拟合(附完整代码)
MATLAB实战用fitdist函数搞定风光数据Weibull与Beta分布拟合附完整代码在可再生能源领域风速和太阳辐照度的随机特性直接影响发电系统的设计与运行。作为一名长期从事风光数据分析的工程师我经常需要处理这样的场景手头积累了数月甚至数年的实测数据却苦于无法快速提取出有效的概率分布特征。传统的手工计算不仅耗时耗力还容易引入人为误差。直到深入掌握了MATLAB的fitdist函数才真正体会到什么叫做让数据自己说话。本文将分享如何用fitdist函数高效完成Weibull和Beta分布的参数拟合特别针对实际工程中常见的夜间零辐照度问题提供解决方案。不同于教科书式的理论讲解这里的所有代码都经过实际项目验证你可以直接复制到自己的MATLAB环境中运行。1. 理解分布特性与数据预处理1.1 Weibull分布在风速建模中的优势Weibull分布因其形状参数的灵活性能够很好地描述风速的随机特性。它的概率密度函数为% Weibull分布概率密度函数公式 f(v) (k/c) * (v/c)^(k-1) * exp(-(v/c)^k)其中k是形状参数shape parameter决定分布曲线的形态c是尺度参数scale parameter反映典型风速值实际项目中我们发现当k≈2时Weibull分布特别接近瑞利分布这正好符合大多数陆地风场的风速特性。1.2 Beta分布处理辐照度数据的要点Beta分布是定义在[0,1]区间的连续概率分布其概率密度函数为% Beta分布概率密度函数公式 f(x) (x^(a-1) * (1-x)^(b-1)) / beta(a,b)关键参数a控制分布左偏程度b控制分布右偏程度重要提示原始辐照度数据需要先归一化到[0,1]区间才能使用Beta分布拟合2. fitdist函数实战应用2.1 风速数据Weibull拟合完整流程假设我们有一个月的风速数据采样间隔为10分钟数据存储在windspeed.mat文件中load(windspeed.mat); % 加载N×24的风速矩阵 k zeros(1,24); c zeros(1,24); for hour 1:24 current_data windspeed(:,hour); pd fitdist(current_data, Weibull); k(hour) pd.B; % 形状参数 c(hour) pd.A; % 尺度参数 % 可视化验证 figure(hour) histfit(current_data, 50, Weibull) title([Hour ,num2str(hour), Weibull Fit]) end对比传统矩估计法% 矩量法参数估计 wind_avg mean(windspeed); wind_std std(windspeed); k_mom (0.9874./(wind_std./wind_avg)).^1.0983; c_mom wind_avg./gamma(11./k_mom);我们通过实际数据测试发现fitdist的极大似然估计结果比矩估计法更稳定特别是在数据量较少时。2.2 处理Beta分布拟合的夜间零值问题光伏数据最棘手的问题是夜间零值导致fitdist报错。这里分享两种解决方案方法一数据筛选法solardata solardata / max(solardata(:)); % 归一化 a zeros(1,24); b zeros(1,24); for hour 1:24 current_data solardata(:,hour); non_zero current_data(current_data 0); % 过滤零值 if ~isempty(non_zero) pd fitdist(non_zero, Beta); a(hour) pd.a; b(hour) pd.b; else a(hour) 0; b(hour) 0; end end方法二混合分布法for hour 1:24 current_data solardata(:,hour); zero_prob mean(current_data 0); if zero_prob 0.9 % 避免全零情况 pd fitdist(current_data(current_data0), Beta); % 存储参数和零值概率 params(hour).a pd.a; params(hour).b pd.b; params(hour).p_zero zero_prob; end end3. 结果验证与可视化技巧3.1 拟合优度检验使用Kolmogorov-Smirnov检验评估拟合效果% Weibull分布检验示例 [h_w,p_w] kstest(windspeed(:,1), CDF, pd) % Beta分布检验示例 [h_b,p_b] kstest(non_zero, CDF, pd)经验值当p值0.05时可以认为拟合效果良好。3.2 专业可视化方法% 绘制Weibull概率图 probplot(weibull, windspeed(:,12)) grid on % 绘制Beta分布拟合曲线 histogram(non_zero, Normalization,pdf) hold on x linspace(0,1,100); plot(x, betapdf(x,a(12),b(12)), LineWidth,2)4. 工程应用中的进阶技巧4.1 批量处理多站点数据当需要处理多个风电场数据时可以使用MATLAB的table类型和rowfun% 假设有10个站点的数据存储在表格windTable中 result rowfun((x) fitdist(x, Weibull), windTable,... OutputVariableNames, {WeibullParams});4.2 参数随时间变化的动态分析% 计算月尺度参数变化 monthly_k zeros(12,1); monthly_c zeros(12,1); for m 1:12 monthly_data windspeed(monthm,:); pd fitdist(monthly_data(:), Weibull); monthly_k(m) pd.B; monthly_c(m) pd.A; end % 绘制季节变化曲线 plot(monthly_k, r-o) hold on plot(monthly_c, b-s)4.3 生成符合分布的随机数据在系统仿真中经常需要基于拟合参数生成随机数% 生成Weibull随机风速 sim_wind wblrnd(c, k, [10000,1]); % 生成Beta随机辐照度考虑零值 sim_solar zeros(10000,1); non_zero_idx rand(10000,1) p_zero; sim_solar(non_zero_idx) betarnd(a, b, [sum(non_zero_idx),1]);在实际项目中我发现fitdist配合MATLAB的Distribution Fitter App使用效率更高。特别是在初步探索数据阶段可以先用App交互式地尝试不同分布找到最佳拟合后再用代码实现批处理。记得保存工作空间变量时使用savefig保存图形这对后续报告撰写非常有帮助。

更多文章