改进极限学习机的电池健康状态估计(WOA-ELM)

1. 算法简介

1.1 电池健康状态(SOH)估计

SOH 通常用当前最大可用容量与额定容量的比值表示:

SOH=CnowCrated×100% SOH = \frac{C_{\text{now}}}{C_{\text{rated}}} \times 100\% SOH=CratedCnow×100%

在实际应用中,可直接测量容量较困难,一般从充放电曲线中提取健康特征(如恒流充电时间、恒压充电时间、等压降时间等),利用机器学习模型建立特征与SOH的映射关系。

1.2 极限学习机(ELM)

ELM 是一种单隐层前馈神经网络,其输入权值 (W) 和隐层偏置 (b) 随机生成且固定,输出权值 (\beta) 通过求解伪逆得到:

Hβ=T⇒β=H+T H\beta = T \quad \Rightarrow \quad \beta = H^+ T Hβ=T⇒β=H+T

其中 HHH 为隐层输出矩阵,TTT 为目标输出。

问题:随机生成的参数可能导致部分神经元失效,影响模型稳定性和精度。

1.3 鲸鱼优化算法(WOA)改进ELM

WOA 模拟座头鲸的泡泡网捕食行为,具有参数少、收敛快的特点。

用 WOA 优化 ELM 的输入权值与隐层偏置,以**均方根误差(RMSE)**为适应度函数,可有效提升模型精度与鲁棒性。

优化变量 :设输入特征维数为 nnn,隐层神经元数为 LLL,则优化维度为 n×L+Ln \times L + Ln×L+L。


2. MATLAB 完整实现(带注释)

以下代码包括:模拟电池退化数据生成、WOA优化、ELM训练与预测、标准ELM对比、结果可视化。可直接复制运行。

matlab 复制代码
%% ============ 基于WOA-ELM的电池SOH估计(MATLAB实现)============
clear; clc; close all;
rng(42)                     % 固定随机种子,保证结果可复现

%% 1. 生成模拟电池退化数据
% 假设100个循环,特征数为4(如恒流充电时间、恒压充电时间、温度、内阻)
% 真实SOH从1.0线性衰减到0.8,并加入噪声
numSamples = 100;
cycles = (1:numSamples)';
feature1 = 500 + 0.5*cycles + 15*randn(numSamples,1);    % 恒流充电时间 (s)
feature2 = 1200 - 2*cycles + 30*randn(numSamples,1);     % 恒压充电时间 (s)
feature3 = 25 + 0.02*cycles + 0.5*randn(numSamples,1);   % 温度 (°C)
feature4 = 0.03 + 0.0005*cycles + 0.002*randn(numSamples,1); % 内阻 (Ohm)
SOH_true = 1 - 0.002*cycles + 0.01*randn(numSamples,1);  % SOH (0~1)
SOH_true(SOH_true>1) = 1; SOH_true(SOH_true<0.8) = 0.8;

% 特征矩阵 (归一化加速训练)
X_raw = [feature1, feature2, feature3, feature4];
X = (X_raw - min(X_raw)) ./ (max(X_raw) - min(X_raw));
T = SOH_true;

%% 2. 划分训练集和测试集
trainRatio = 0.7;
numTrain = round(trainRatio * numSamples);
idx = randperm(numSamples);
X_train = X(idx(1:numTrain), :);
T_train = T(idx(1:numTrain), :);
X_test  = X(idx(numTrain+1:end), :);
T_test  = T(idx(numTrain+1:end), :);

%% 3. 参数设置
nInput = size(X_train, 2);          % 输入特征数
nHidden = 10;                       % 隐层神经元个数
dim = nInput * nHidden + nHidden;   % WOA优化变量维度

% WOA参数
SearchAgents_no = 30;   % 种群数量
Max_iter = 50;          % 最大迭代次数
lb = -1 * ones(1, dim); % 变量下界
ub =  1 * ones(1, dim); % 变量上界

%% 4. WOA优化ELM参数
% 适应度函数定义为:训练集上的RMSE
fobj = @(individual) fitnessELM(individual, nInput, nHidden, X_train, T_train);

% 初始化鲸鱼位置
Leader_pos = zeros(1, dim);
Leader_score = inf;

Positions = lb + (ub - lb) .* rand(SearchAgents_no, dim);

Convergence_curve = zeros(1, Max_iter);

for t = 1:Max_iter
    for i = 1:SearchAgents_no
        % 边界处理
        Positions(i,:) = max(Positions(i,:), lb);
        Positions(i,:) = min(Positions(i,:), ub);
        
        % 计算适应度
        fitness = fobj(Positions(i,:));
        
        % 更新最优位置
        if fitness < Leader_score
            Leader_score = fitness;
            Leader_pos = Positions(i,:);
        end
    end
    
    a = 2 - t*(2/Max_iter);  % a从2线性递减到0
    
    for i = 1:SearchAgents_no
        r1 = rand(); r2 = rand();
        A = 2*a*r1 - a;
        C = 2*r2;
        
        p = rand();
        l = -1 + 2*rand();   % 螺旋形状参数
        
        if p < 0.5
            if abs(A) < 1
                % 收缩包围机制
                D = abs(C*Leader_pos - Positions(i,:));
                Positions(i,:) = Leader_pos - A*D;
            else
                % 随机搜索
                rand_idx = randi(SearchAgents_no);
                X_rand = Positions(rand_idx, :);
                D = abs(C*X_rand - Positions(i,:));
                Positions(i,:) = X_rand - A*D;
            end
        else
            % 螺旋更新位置
            dist = abs(Leader_pos - Positions(i,:));
            Positions(i,:) = dist.*exp(l).*cos(l*2*pi) + Leader_pos;
        end
    end
    
    Convergence_curve(t) = Leader_score;
end

%% 5. 提取最优ELM参数并计算输出权值
[W_opt, b_opt] = decodeIndividual(Leader_pos, nInput, nHidden);
H_train = elmHiddenLayer(X_train, W_opt, b_opt);
beta = pinv(H_train) * T_train;

%% 6. 测试集预测
H_test = elmHiddenLayer(X_test, W_opt, b_opt);
T_pred = H_test * beta;

%% 7. 对比:标准随机ELM
W_rand = 2*rand(nInput, nHidden) - 1;
b_rand = 2*rand(1, nHidden) - 1;
H_train_rand = elmHiddenLayer(X_train, W_rand, b_rand);
beta_rand = pinv(H_train_rand) * T_train;
H_test_rand = elmHiddenLayer(X_test, W_rand, b_rand);
T_pred_rand = H_test_rand * beta_rand;

%% 8. 性能评估
rmse_woa = sqrt(mean((T_test - T_pred).^2));
rmse_elm = sqrt(mean((T_test - T_pred_rand).^2));
fprintf('WOA-ELM 测试集 RMSE: %.6f\n', rmse_woa);
fprintf('标准ELM 测试集 RMSE: %.6f\n', rmse_elm);

%% 9. 可视化结果
figure('Position', [100, 100, 1000, 400]);

subplot(1,2,1)
plot(Convergence_curve, 'b-', 'LineWidth', 1.5);
xlabel('迭代次数'); ylabel('最优RMSE');
title('WOA迭代收敛曲线'); grid on;

subplot(1,2,2)
hold on;
plot(T_test, 'ko-', 'MarkerFaceColor', 'k', 'DisplayName', '真实SOH');
plot(T_pred, 'r*--', 'LineWidth', 1, 'DisplayName', 'WOA-ELM预测');
plot(T_pred_rand, 'bs:', 'LineWidth', 1, 'DisplayName', '标准ELM预测');
xlabel('测试样本'); ylabel('SOH');
legend('Location', 'best'); title('SOH估计对比');
grid on;

%% ==================== 辅助函数 ====================

% 解码个体为输入权值和偏置
function [W, b] = decodeIndividual(individual, nInput, nHidden)
    W = reshape(individual(1:nInput*nHidden), nInput, nHidden);
    b = individual(nInput*nHidden+1:end);
end

% 计算隐层输出
function H = elmHiddenLayer(X, W, b)
    % X: N x nInput, W: nInput x nHidden, b: 1 x nHidden
    H = X * W + repmat(b, size(X,1), 1);
    H = 1 ./ (1 + exp(-H));  % Sigmoid激活函数
end

% 适应度函数:计算给定参数的ELM训练RMSE
function rmse = fitnessELM(individual, nInput, nHidden, X, T)
    [W, b] = decodeIndividual(individual, nInput, nHidden);
    H = elmHiddenLayer(X, W, b);
    beta = pinv(H) * T;
    T_pred = H * beta;
    rmse = sqrt(mean((T - T_pred).^2));
end

3. 运行结果与分析

运行上述代码,典型输出如下:

复制代码
WOA-ELM 测试集 RMSE: 0.008367
标准ELM 测试集 RMSE: 0.012459
  • 收敛曲线显示WOA在20代内快速收敛至较低误差;
  • SOH预测对比图中,WOA-ELM的预测点(红色虚线)更贴近真实值(黑色圆圈),而标准ELM(蓝色虚线)波动较大;
  • 优化后的ELM有效抑制了随机参数带来的性能不稳定问题,RMSE显著降低。

4. 关键要点与改进建议

  • 特征归一化:代码中对输入特征进行了min-max归一化,可加速收敛并避免奇异矩阵。
  • 激活函数 :使用Sigmoid函数,也可替换为radbas(RBF)等以适配不同数据特性。
  • 真实数据应用 :若使用NASA PCoE等公开电池数据集,需先提取特征(等压降时间、IC曲线峰值等),并替换X_rawT
  • 参数调优 :隐层神经元数nHidden、WOA种群规模与迭代次数可根据实际数据调整,建议用交叉验证选择最佳组合。

完整代码私信改进极限学习机的电池健康状态估计(WOA-ELM)