当前位置: 首页 > news >正文

EMD-SVM 太阳能功率预测

含数据读取→EMD 分解→SVM 回归→多步预测→结果保存/绘图,完成 EMD-SVM 太阳能功率预测
基于 15 min 采样光伏功率 + 4 维气象数据


一、文件结构

EMD_SVM_Solar/  
├─ main.m                % 主脚本  
├─ emd_decomp.m          % 调用 EMD 分解  
├─ build_train_svm.m     % 训练 SVM 子函数  
├─ forecast_svm.m        % 滚动预测子函数  
├─ calc_metrics.m        % 计算 MAPE/RMSE/R²  
├─ data/  
│  ├─ solar_power.xlsx   % 时间序列功率  
│  └─ weather.xlsx       % 同期气象数据  
└─ results/              % 输出图、指标表  

二、数据格式

  • solar_power.xlsx
    列 A:时间(yyyy-mm-dd HH:MM:SS)
    列 B:功率(MW)

  • weather.xlsx
    列 A-D:辐照度(W/m²)、温度(°C)、风速(m/s)、湿度(%)

(数据须对齐、无缺失;如缺失请先插值。)


三、核心代码

  1. main.m —— 一键运行
%% 1. 读数 & 归一化
clear; clc; close all;
power = readmatrix('data/solar_power.xlsx','Range','B:B');
meteo = readmatrix('data/weather.xlsx');          % 4×N
N = length(power);% 归一到 [0,1]
power = (power - min(power)) / (max(power) - min(power));%% 2. EMD 分解
[IMFs, res] = emd_decomp(power);          % 返回 cell 数组
K = numel(IMFs);                          % IMF 个数%% 3. 构造监督数据集
lag = 24;   % 用过去 6h 预测下一步
[X, Y] = deal(cell(K,1));                 % 每个 IMF 独立
for k = 1:K[X{k}, Y{k}] = buildData(IMFs{k}, meteo, lag);
end%% 4. 训练/验证/测试划分
ratio = [0.7 0.15 0.15];
idx = splitData(N-lag, ratio);mdl = cell(K,1);
for k = 1:Kmdl{k} = build_train_svm(X{k}(idx.train,:), Y{k}(idx.train));
end%% 5. 测试集滚动预测
horizon = 96;   % 预测未来 24h
pred = zeros(horizon, K);
lastWin = cellfun(@(x) x(end-lag+1:end), IMFs, 'uni', 0);
meteoFut = meteo(end-horizon+1:end, :);   % 假设已知未来气象for t = 1:horizonfor k = 1:Kfeat = [lastWin{k}'; meteoFut(t,:)'];pred(t,k) = predict(mdl{k}, feat');lastWin{k}(1:end-1) = lastWin{k}(2:end);lastWin{k}(end) = pred(t,k);end
end
yhat = sum(pred,2);                       % 反归一化前
yhat = yhat*(max(power)-min(power))+min(power);%% 6. 评估 & 绘图
ytrue = readmatrix('data/solar_power.xlsx','Range', sprintf('B%d:B%d', N-horizon+2, N+1));
figure; plot(ytrue,'b'); hold on; plot(yhat,'r--');
legend('真实','预测'); xlabel('采样点'); ylabel('功率 MW');
title(sprintf('EMD-SVM 未来 24h 预测\\nMAPE=%.2f%%',calc_metrics(ytrue,yhat)));writematrix([ytrue, yhat],'results/pred24h.csv');
  1. emd_decomp.m —— 调用 MATLAB 内置 emd
function [IMFs, res] = emd_decomp(sig)[IMFs, res] = emd(sig,'MaxNumIMF',8,'Display',0);IMFs = mat2cell(IMFs, size(IMFs,1), ones(1,size(IMFs,2)));
end
  1. buildData.m —— 生成监督样本
function [X, y] = buildData(sig, meteo, lag)N = numel(sig);X = []; y = [];for t = lag:N-1X = [X; [sig(t-lag+1:t)'  meteo(t+1,:)]]; %#ok<AGROW>y = [y; sig(t+1)];end
end
  1. splitData.m —— 时序划分
function idx = splitData(N, ratio)trainN = floor(N*ratio(1));valN   = floor(N*ratio(2));idx.train = 1:trainN;idx.val   = trainN+1:trainN+valN;idx.test  = trainN+valN+1:N;
end
  1. build_train_svm.m —— 训练 ε-SVR(RBF)
function mdl = build_train_svm(X, y)% 网格搜索 [C,gamma](可换成贝叶斯优化)C_set   = 2.^(-2:2:8);g_set   = 2.^(-5:2:3);best = struct('mse',Inf);for C = C_set, for g = g_setmdl = fitrsvm(X, y, 'KernelFunction','rbf', ...'KernelScale',1/g, 'BoxConstraint',C, ...'Standardize',true);yhat = predict(mdl, X);mse = mean((y-yhat).^2);if mse < best.mse, best = struct('mdl',mdl,'mse',mse); endend, endmdl = best.mdl;
end
  1. calc_metrics.m —— 指标计算
function mape = calc_metrics(ytrue, yhat)mape = mean(abs((ytrue-yhat)./ytrue))*100;fprintf('RMSE=%.3f MW, R²=%.3f\n', ...sqrt(mean((ytrue-yhat).^2)), 1-var(ytrue-yhat)/var(ytrue));
end

四、运行步骤

  1. 将两份 Excel 放入 data/ 目录。

  2. 在 MATLAB 命令行执行

    >> addpath(genpath(pwd));
    >> main
    
  3. 结束后可在 results/ 查看

    • pred24h.csv(两列:真实 | 预测)
    • 自动弹出的对比图。

参考代码 实现emd的分解并利用svm预测 www.youwenfan.com/contentcsk/113013.html

五、可扩展提示

  • 模态混叠 → 改用 CEEMDAN(ceemdan 函数)。
  • 高维气象 → 先用 PCA 降维,再送入 SVM。
  • 超参搜索慢 → 用 bayesopt 替代网格搜索。
  • 长期预测 → 将 SVM 替换为 LSTM,保持 EMD 分解框架。
http://www.dtcms.com/a/540309.html

相关文章:

  • FFMPEG-1:下载与安装,文件组成,ffmpeg -h 命令汇总,练习使用 ffmpeg、ffplay、ffprobe,
  • 蚂蚁开源高性能扩散语言模型框架dInfe,推理速度提升十倍
  • DVWA靶场通关笔记
  • transformer结构
  • Spring Boot 移除 Undertow:技术背景、迁移方案与避坑指南(附源码级解析)
  • 龙岩食品有限公司搜索引擎优化的英文缩写
  • 【Linux】进程状态|优先级|进程切换|环境变量
  • 2025智能体元年:AI重塑产业格局
  • 计网4.4.1 路由算法
  • 038-Spring AI Alibaba VLLM Chat 功能完整案例
  • MCU的时钟树(Clock Tree)是什么?
  • 用 htmi5做网站海南最新消息新闻
  • 深入解析Linux MISC驱动框架
  • 【Linux学习笔记】线程安全问题之单例模式和死锁
  • 百日挑战-单词版(第六天)
  • 专为WebGIS开发者打造的用户端---GISBox
  • std::set、std::multiset 和 std::unordered_set的异同
  • iO 拆解:从熟悉的密码模块构建
  • 2026年AEI SCI1区TOP,混合近端策略粒子群算法+公路线形优化,深度解析+性能实测
  • 英文的购物网站泉州网站建设方案详细
  • 如何建公司网站的步骤ppt做的最好的网站
  • 网站建设比较好的多少钱建企业网站需要哪些资料
  • 深圳住房和城乡建设部网站大学网站 作风建设专题
  • 电商网站建设需要活动 网站 源码
  • 如何使用Spring Cloud Gateway实现动态路由?
  • Linux Wlan 无线协议栈开发-传输层详解
  • 前端基础之《React(4)—webpack简介-编译打包优化》
  • F039 python五种算法美食推荐可视化大数据系统vue+flask前后端分离架构
  • 网站开发框架参考文献京东官方网上商城
  • Spring OXM:轻松实现Java-XML互转