基于支持向量机和NSGA-II的非晶合金变压器结构优化算法MATLAB仿真

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于支持向量机和NSGA-II的非晶合金变压器结构优化算法MATLAB仿真相关的知识,希望对你有一定的参考价值。

目录

一、理论基础

二、MATLAB程序

三、仿真结论


一、理论基础

      变压器是当今社会不可或缺的电气设备,非晶合金变压器更是由于节能和环保的特点被国内电力部门所认可。本章选择非晶合金变压器作为研究对象,从变压器有限元仿真计算出发,通过采用正交实验与随机实验设计结合方法获得变压器参数样本空间,利用支持向量机对其电磁模型进行非参数建模,并验证模型的精度;接着使用NSGA-II算法对其结构进行优化,得到一组最优的变压器结构参数,并采用有限元模型验证优化结果的可靠性。

       支持向量机(Support Vector Machine,SVM)是由Vapnik等人在1995年提出的基于统计学习理论的机器学习方法,它主要是依据有限的样本数据,采用结构风险最小化原则,在模型的复杂性和学习能力之间寻求最佳折衷,以此来获得最好的泛化能力(对未知样本数据预测时的精准度)。它与传统人工神经网络相比,不但结构简单,而且泛化能力得到了提高,在解决小样本、高维数和非线性问题中表现出优异的特性。

       SVM 回归形式上类似于一个神经网络,结构如图所示。

      非晶合金变压器参数与输出性能之间的关系采用支持向量机建立的模型进行计算,该计算模型是复杂的非线性函数,不能用显式表达,只能给出输入输出之间的映射关系,从而不能采用传统的最优化方法来解决。NSGA-II算法在这方面没有严格的限制,它不仅收敛速度较快,还具有较高避免陷入局部最优的能力,因此采用NSGA-II算法进行变压器参数进行优化,模型建立和参数寻优的流程如图所示。 

二、MATLAB程序

这个函数的设计流程如下:

第一读取数据,然后得到5个x和4个y。

第二、得到130个训练数据,

多核SVM的训练

预测

显示真实数据和预测数据的对比

这个过程中,核心是MSVM训练,他的内部解释如下:

对应公式

即四个SVM合起来。

对应两个

对于NSGAII而言,核心程序如下:

第一读取数据,然后得到5个x和4个y。

NGSA2初始化

优化迭代

…………………

优化迭代过程分为

选择交叉

变异

然后核心部分优化目标的建立如下:

将每次参与优化的5个参数作为优化变量输入到SVM模型进行优化,

----------------------------------------------------------------------------------------------------------------------------

综上所述,上述整体代码如下所示:

clc;
clear;
close all;
warning off;
addpath 'func\\'
rng('default');

% 论文中的是电机结构参数l h & t s,我的是 x1 x2 x3 x4 x5(分别是铁心高度 铁心厚度 绕组匝数 窗口宽度 导线截面积 );;

% 论文中的目标值是推力、电流、效率和畸变率。我的y1 y2 y3 y4(分别是体积v、加速度ax、加速度ay和加速度az)

% 补充:优化输入变量的范围
% x1:100-180;x2 40-65;x3 40-100;x4: 30-60;x5 0.5-2.5



data   = xlsread('样本数据.xlsx');
%x1 x2 x3 x4 x5(分别是铁心高度 铁心厚度 绕组匝数 窗口宽度 导线截面积 )
x      = data(:,1:5);
x1     = x(:,1);
x2     = x(:,2);
x3     = x(:,3);
x4     = x(:,4);
x5     = x(:,5);

%y1 y2 y3 y4(分别是体积v、加速度ax、加速度ay和加速度az)
y      = data(:,6:9);
y1     = y(:,1);
y2     = y(:,2);
y3     = y(:,3);
y4     = y(:,4);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
Lens   = 130;
idx    = 1:160;


x1_train = x1(idx(1:Lens));
x2_train = x2(idx(1:Lens));
x3_train = x3(idx(1:Lens));
x4_train = x4(idx(1:Lens));
x5_train = x5(idx(1:Lens));

y1_train = y1(idx(1:Lens))/1e6;
y2_train = y2(idx(1:Lens));
y3_train = y3(idx(1:Lens));
y4_train = y4(idx(1:Lens));

x1_test = x1(idx(Lens+1:end));
x2_test = x2(idx(Lens+1:end));
x3_test = x3(idx(Lens+1:end));
x4_test = x4(idx(Lens+1:end));
x5_test = x5(idx(Lens+1:end));

y1_test = y1(idx(Lens+1:end))/1e6;
y2_test = y2(idx(Lens+1:end));
y3_test = y3(idx(Lens+1:end));
y4_test = y4(idx(Lens+1:end));
 
 
[W,B,C,Para1,Para2] = func_MSVM(x1_train,x2_train,x3_train,x4_train,x5_train,y1_train,y2_train,y3_train,y4_train);

[y11,y12,y13,y14]   = func_prediction(x1_train,x1_test,x2_train,x2_test,x3_train,x3_test,x4_train,x4_test,x5_train,x5_test,Para1,Para2,B);

disp('误差率百分比:%'); 
 
figure;plot(y11,'rx');hold on;plot(y1_test,'linewidth',1);legend('SVM测试数据','真实数据');title('体积v');   100*mean(abs(y11-y1_test)./y1_test) 
figure;plot(y12,'rx');hold on;plot(y2_test,'linewidth',1);legend('SVM测试数据','真实数据');title('加速度ax');100*mean(abs(y12-y2_test)./y2_test) 
figure;plot(y13,'rx');hold on;plot(y3_test,'linewidth',1);legend('SVM测试数据','真实数据');title('加速度ay');100*mean(abs(y13-y3_test)./y3_test) 
figure;plot(y14,'rx');hold on;plot(y4_test,'linewidth',1);legend('SVM测试数据','真实数据');title('加速度az');100*mean(abs(y14-y4_test)./y4_test) 

disp('准确率百分比:%'); 
n1=0;
n2=0;
n3=0;
n4=0;
for i = 1:length(y1_test)
    if abs(y11(i)-y1_test(i)) <= 0.0008;
       n1=n1+1;
    end
    if abs(y12(i)-y2_test(i)) <= 0.0004;
       n2=n2+1;
    end
    if abs(y13(i)-y3_test(i)) <= 0.0003;
       n3=n3+1;
    end
    if abs(y14(i)-y4_test(i)) <= 0.001;
       n4=n4+1;
    end
end

100*n1/length(y11)
100*n2/length(y12)
100*n3/length(y13)
100*n4/length(y14)

SVM代码如下:

function [W,B,C,Para1,Para2]=func_MSVM(x1,x2,x3,x4,x5,y1,y2,y3,y4);

x   = [x1,x2,x3,x4,x5]; 
%这些参数通过穷举法不断对比,选择训练误差较小的结果
% C1  = 400;
% Pa1 = 4.5;
% Pb1 = 3.2;
% 
% 
% C2  = 400;
% Pa2 = 4.5;
% Pb2 = 3.2;
% 
% 
% C3  = 400;
% Pa3 = 4.5;
% Pb3 = 3.2;
% 
% 
% C4  = 400;
% Pa4 = 4.5;
% Pb4 = 3.2;
C1  = 512;
C2  = 331;
C3  = 148;
C4  = 231;

Pa1 = 1.8;
Pa2 = 2.7;
Pa3 = 2.8;
Pa4 = 3.7;
Pb1 = 1.5;
Pb2 = 1.7;
Pb3 = 2.15;
Pb4 = 2.4;
[alpha1,alphb1,bias1] = svm_model(x,y1,'rbf',C1,Pa1,Pb1);
W1a = x'*alpha1; 
W1b = x'*alphb1; 
B1  = bias1; 

[alpha2,alphb2,bias2] = svm_model(x,y2,'rbf',C2,Pa2,Pb2);
W2a = x'*alpha2; 
W2b = x'*alphb2; 
B2 = bias2; 

[alpha3,alphb3,bias3] = svm_model(x,y3,'rbf',C3,Pa3,Pb3);
W3a = x'*alpha3; 
W3b = x'*alphb3; 
B3 = bias3; 

[alpha4,alphb4,bias4] = svm_model(x,y4,'rbf',C4,Pa4,Pb4);
W4a = x'*alpha4; 
W4b = x'*alphb4;
B4  = bias4; 

y11=kernel('rbf',x,x(find(alpha1),:),Pa1)*alpha1(find(alpha1))+kernel('rbf',x,x(find(alphb1),:),Pb1)*alphb1(find(alphb1))+bias1;
y12=kernel('rbf',x,x(find(alpha2),:),Pa2)*alpha2(find(alpha2))+kernel('rbf',x,x(find(alphb2),:),Pb2)*alphb2(find(alphb2))+bias2;
y13=kernel('rbf',x,x(find(alpha3),:),Pa3)*alpha3(find(alpha3))+kernel('rbf',x,x(find(alphb3),:),Pb3)*alphb3(find(alphb3))+bias3;
y14=kernel('rbf',x,x(find(alpha4),:),Pa4)*alpha4(find(alpha4))+kernel('rbf',x,x(find(alphb4),:),Pb4)*alphb4(find(alphb4))+bias4;
 
W     = [W1a,W1b,W2a,W2b,W3a,W3b,W4a,W4b];
B     = [B1,B2,B3,B4];
C     = [C1,C2,C3,C4]';
Para1 = [Pa1,Pa2,Pa3,Pa4]';
Para2 = [Pb1,Pb2,Pb3,Pb4]';
 

三、仿真结论

 

 

 

 A05-83

以上是关于基于支持向量机和NSGA-II的非晶合金变压器结构优化算法MATLAB仿真的主要内容,如果未能解决你的问题,请参考以下文章

支持向量机(2)

python实现支持向量机之非线性支持向量机和核函数(理论五)

基于遗传算法寻优的多核支持向量机故障诊断系统

支持向量机和集群?困惑

补充知识支持向量机和核函数

补充知识支持向量机和核函数