【MatLab】《遗传算法GA+BP神经网络——电路参数估计》

matlab语言 遗传算法GA+BP神经网络 电路参数估计

一、整体设计概述:BP神经网络代理电路模型 GA寻找误差最小参数

根据采样数据训练BP神经网络,用训练好的网络来作为目标函数输出电路参数误差,通过GA寻找误差最小的电路参数值。
在这里插入图片描述

在这里插入图片描述

二、代码实现(需要完整代码的私聊)

BP.m 主函数

clc
close all
clear all
%% 训练BP模型
datapath='f=85000.xls';
f=85000;
% datapath='f=6.393341925217580e+04.xls';
myBP=BPMod(datapath);
%% 使用BP模型预测
Iin_cl=16.54;
Icf_cl=19.28;
[M_pre,RL_pre]=mypredictor(myBP,Iin_cl,Icf_cl);
[Iin_exp,Icf_exp]=get_expI(f,M_pre,RL_pre);

disp(['Iin测量值为:',num2str(Iin_cl)])
disp(['Icf测量值为:',num2str(Icf_cl)])
error=abs(Iin_cl-Iin_exp)+abs(Icf_cl-Icf_exp);
disp(['最小误差为:',num2str(error)])

disp(['M预测值为:',num2str(M_pre)])
disp(['RL预测值为:',num2str(RL_pre)])

disp(['Iin计算值为:',num2str(Iin_exp)])
disp(['Icf计算值为:',num2str(Icf_exp)])




BPMod.m 数据处理+训练BP网络

function myBP=BPMod(datapath)
%% 数据预处理
% datapath='f=85000.xls';
data=xlsread(datapath);
trainRatio=0.75;
valRatio=0;
testRatio=1-trainRatio;
[trainInd,valInd,testInd] = dividerand(max(size(data)),trainRatio,valRatio,testRatio);
input_train=data(trainInd,3:4);
output_train=data(trainInd,1:2);
input_test=data(testInd,3:4)';
output_test=data(testInd,1:2)';
% %% 数据归一化
% for i=1:size(output_train,2)
%     output_train(:,i)=mymaxminmap(output_train(:,i));
% end
%% 输入输出数据归一化
[inputn,inputps]=mapminmax(input_train');
[outputn,outputps]=mapminmax(output_train');
% outputn=outputn';
%% BP网络训练
node_in_num=2; % 输入层节点数量
% node_hidden_num=2*node_in_num+1;% 隐含层节点数量
node_out_num=2;
node_hidden_num=(node_out_num+node_in_num)+randi([1,10]);% 隐含层节点数量

% %初始化网络结构
% net=newff(inputn,outputn,node_hidden_num);
net=feedforwardnet(11,'trainlm');
net.trainParam.epochs=10000;
net.trainParam.lr=0.01;
net.trainParam.goal=0.0002;
net.trainParam.showCommandLine=true;
net.trainParam.max_fail = 20;
% net.divideFcn='divideind';
% net.trainParam.showWindow=true;
%网络训练
net=train(net,inputn,outputn);
%% BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
%网络预测输出
an=sim(net,inputn_test);
%网络输出反归一化
BPoutput=mapminmax('reverse',an,outputps);
%% 
figure
subplot(2,1,1)
plot(BPoutput(1,:),'r*')
hold on
plot(output_test(1,:),'bo')
plot(abs(BPoutput(1,:)-output_test(1,:)),'c--.')
legend('BP预测值','实际值','误差绝对值')
title('Iin')
grid on
subplot(2,1,2)
plot(BPoutput(2,:),'r*')
hold on
plot(output_test(2,:),'bo')
hold on
plot(abs(BPoutput(2,:)-output_test(2,:)),'c--.')
legend('BP预测值','实际值','误差绝对值')
title('Icf')
grid on

[c,l]=size(BPoutput);
error=abs(BPoutput(2,:)-output_test(2,:))+...
    abs(BPoutput(1,:)-output_test(1,:));
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(node_hidden_num),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])
myBP.inputps=inputps;
myBP.net=net;
myBP.outputps=outputps;

% f=85000;
% RL=50;
% M=5.477e-5;
% % [Iin_exp,Icf_exp]=get_expI(f,M,RL);
% % 
% fitness=getfitness(myBP,f,M,RL);

GA.m 遗传算法主函数

clc
close all
clear all
%% 模型参数
f=85000;
RL_max=200;
RL_min=50;
M_max=1e-4;
M_min=1e-5;
Iin_cl=16.54;
Icf_cl=19.28;
%% GA参数设置
Maxgen=1000;
Popnum=50;
Pc=0.5;
Pm=0.5;
%%  初始化种群
for i=1:Popnum
    chrom(i).M=(M_max-M_min)*rand()+M_min;
    chrom(i).RL=(RL_max-RL_min)*rand()+RL_min;
    chrom(i).fitness=getfitness(f,Iin_cl,Icf_cl,chrom(i).M,chrom(i).RL);
end
%% 种群进化
gen=0;
while gen<Maxgen
    gen=gen+1
    Newchrom=chrom;
    for i=1:Popnum
        temppop=Newchrom(i);
        pc=rand();
        if pc<Pc
            temppop=across(temppop,chrom,Popnum,f,Iin_cl,Icf_cl);
        end
        pm=0;
        if pm<Pm
            temppop=mutation(temppop,f,M_max,M_min,RL_max,RL_min,Iin_cl,Icf_cl);
        end
        Newchrom(i)=temppop;
    end
    Chrom_all=[chrom,Newchrom];
    [V,ind]=sort([Chrom_all.fitness]);
    chrom=Chrom_all(ind(1:Popnum));
    bestV(gen)=V(1);
    bestpop(gen)=Chrom_all(ind(1));
end
%% 显示结果
figure
plot(bestV)
xlabel('迭代次数')
ylabel('目标函数值')
title('进化曲线')
legend('最优解')

disp(['Iin测量值(BP预测)为:',num2str(Iin_cl)])
disp(['Icf测量值(BP预测)为:',num2str(Icf_cl)])

disp(['最小误差为:',num2str(bestV(end))])
disp(['最小误差对应的M为:',num2str(bestpop(end).M)])
disp(['最小误差对应的RL为:',num2str(bestpop(end).RL)])

[Iin_exp,Icf_exp]=get_expI(f,bestpop(end).M,bestpop(end).RL);
disp(['Iin计算值为:',num2str(Iin_exp)])
disp(['Icf计算值为:',num2str(Icf_exp)])



三、结果展示

BP神经网络训练情况

本模型使用BP神经网络来代理实际电路的输出,因此神经网络的回归效果一定要好,预测结果贴近实际电路输出,这样才能确保后续参数寻优的准确性
在这里插入图片描述

遗传算法优化结果

以电路参数误差为目标函数,通过GA+bp模型 找到最优的参数。
一是通过进化曲线,确认GA算法已经收敛,如果不收敛的话就调整GA的参数,使得在迭代后期目标函数值趋于稳定。
在这里插入图片描述
在这里插入图片描述
可以看到BP模型的预测值和实际值很接近,说明BP神经网络训练效果较好,最终误差为0.53179,对应的电路参数M和RL也通过GA得到。

四、项目分享

源码链接:C币下载
需要免费分享的关注+点赞+收藏的 私聊领取
完整的项目内容
包含:
**模型文件和电路数据
BP模型代码
GA模型代码
均可分别运行

内含simulink封装好的S函数 可以支持simulink使用
可以结合这个案例,学习遗传算法和BP神经网络的单独使用的方法,以及遗传算法+BP代理模型联合仿真的方法,如果你的问题是电路参数估计的模型,更改数据和公式之后可以直接使用

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于MATLAB遗传算法GA)可以用来优化BP神经网络的参数,以提高其性能和准确性。 首先,需要确定BP神经网络的输入层、隐藏层和输出层的神经元数量,并确定神经网络的拓扑结构。 然后,我们可以定义适应度函数,用来衡量BP神经网络的性能。适应度函数可以根据问题的具体要求来定义,例如,可以使用均方根误差(RMSE)作为适应度函数。 接下来,我们可以使用MATLAB中的GA函数来进行遗传算法优化。首先,需要定义GA函数的参数设置,包括种群大小、迭代次数、交叉概率、变异概率等。然后,可以使用MATLABGA函数来进行优化,使得适应度函数的值达到最小值。 在每一次迭代中,GA函数会根据适应度函数的值来选择优秀的个体,并通过交叉操作和变异操作进行进一步的优化。交叉操作可以通过将两个个体的基因信息进行互换来产生新的子代个体,而变异操作可以随机改变个体的某些基因值。 最后,经过多次迭代后,GA函数会输出最优的参数组合,即优化后的BP神经网络。可以将这些参数应用于BP神经网络中,并进行测试和评估,以验证其性能的提升。 总结起来,基于MATLAB遗传算法优化BP神经网络的步骤为:确定神经网络结构和参数,定义适应度函数,设置GA函数的参数,使用GA函数进行优化,得到优化后的参数组合,将参数应用于BP神经网络,并进行测试和评估。这样就可以通过遗传算法优化BP神经网络,提高其预测和分类性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝色洛特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值