m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
查看: 523|回复: 0|关注: 0
打印 上一主题 下一主题

[未答复] 采用粒子群算法辨识simulink模型中的参数时一直不收敛

[复制链接]

新手

5 麦片

财富积分


050


1

主题

1

帖子

0

最佳答案
跳转到指定楼层
1#
发表于 2019-4-26 15:30:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用粒子群算法辨识simulink模型中的参数时一直不收敛,已知搭建的模型没问题,但仿真输出曲线与实际曲线差别很大
下面时采用的仿真程序
format long e
points=36659; %样本点数
vec=2; %待估参数向量维数
Pop=200; %种群大小
Vmax=2; %最大速度
Vmin=-2; %最小速度
nIter=200; %迭代次数
Wmax=0.8; %最大惯性因子
Wmin=0.0; %最小惯性因子
Wn=1.0; %惯性因子衰减指数
FaiI=0.2; %自身学习率
FaiG=0.8; %社会学习率
t=30;
r1=2;
r2=2;
u=4;%设置混沌
Ub=[23239 25436]; %待辨识参数取值上限
Lb=[23235 25432]; %待辨识参数取值下限


%粒子群
%当前位置vec维 个体历史最优位置vec维 全局最优位置vec维 当前值 个体历史最优值 全局最优值
Range=ones(Pop,1)*(Ub-Lb);
P=rand(Pop,vec).*Range+ones(Pop,1)*Lb; %初始化粒子群
P(:,vec+1:vec*2)=P(:,1:vec); %将粒子位置赋值给个体极值
Csp=P(:,1);
Csn=P(:,2);
open_system('SP2D_2');
set_param('SP2D_2/Subsystem/Csp','Gain','Csp');
set_param('SP2D_2/Subsystem1/Csn','Gain','Csn');
[t_time,x_state,y_out]=sim('SP2D_2',[0,36658]);
% 更新适应值
P(:,vec*3+1)=Fitness(P(:,1:vec),Y,Voltage);
P(:,vec*3+2)=P(:,vec*3+1);  %将自身适应度值赋给自身适应度值最优
P(:,vec*3+3)=P(1,vec*3+1);  %将自身适应度值赋给群体适应度
% 更新全局最优位置和适应值
%
for j=1:Pop
if P(j,vec*3+2)<P(1,vec*3+3) %若当前粒子的自身适应度最优小于群体适应度值,将当前粒子自身适应度最优赋值给群体适应度值
P(1,vec*3+3)=P(j,vec*3+2);
P(1,vec*2+1:vec*3)=P(j,vec+1:vec*2); %将个体极值赋值给群体极值
%P(j,3)=P(j,2);
end
end
P(:,vec*2+1:vec*3)=ones(Pop,1)*P(1,vec*2+1:vec*3);
P(:,vec*3+3)=P(1,vec*3+3);
%粒子群速度 ;
V=rand(Pop,vec)*(Vmax-Vmin)+Vmin; %初始化速度
for i=1:nIter
Csp=P(:,1);
Csn=P(:,2);
open_system('SP2D_2');
set_param('SP2D_2/Subsystem/Csp','Gain','Csp');
set_param('SP2D_2/Subsystem1/Csn','Gain','Csn');
[t_time,x_state,y_out]=sim('SP2D_2',[0,36658]);
% 更新惯性因子
W=(Wmax-Wmin)*exp(-(t*i/ nIter)^2)+ Wmin; %自适应调节惯性权重ω,t是经验系数,在20到55之间;
r1=(sin(8*pi*r1)+1)^2/4;
r2=(sin(8*pi*r2)+1)^2/4;
% 更新速度
V=W.*V + FaiI.*r1*(P(:,vec+1:vec*2)-P(:,1:vec))+FaiG.*r2*(P(:,vec*2+1:vec*3)-P(:,1:vec));
% 限制速度
V(find(V>Vmax))=Vmax;
V(find(V<Vmin))=Vmin;

% 更新位置
P(:,1:vec)=(P(:,1:vec) + V(:,1:vec));
for j=1:Pop
     for k=1:vec
        if P(j,k)>Ub(k),P(j,k)=Ub(k);end %设置待辨识参数的上下限
        if P(j,k)<Lb(k),P(j,k)=Lb(k);end  
     end
end

% 更新适应值
P(:,vec*3+1)=Fitness(P(:,1:vec),Y,Voltage);
% 更新个体最优位置和适应值
for j=1:Pop
if P(j,vec*3+1) < P(j,vec*3+2)
P(j,vec+1:vec*2)=P(j,1:vec);
P(j,vec*3+2)=P(j,vec*3+1);
end
end
% 更新全局最优位置和适应值
for j=1:Pop
if P(j,vec*3+2)<P(1,vec*3+3)
P(1,vec*3+3)=P(j,vec*3+2);
P(1,vec*2+1:vec*3)=P(j,vec+1:vec*2);
%P(j,3)=P(j,2);
end
end
% 复制冗余部分以方便计算
P(:,vec*2+1:vec*3)=ones(Pop,1)*P(1,vec*2+1:vec*3);
%P(:,3)=ones(Pop,1)*P(1,3);
P(:,vec*3+3)=P(1,vec*3+3);
%计算群体适应度方差
favg=sum(P(:,vec*3+1))/200;
b=P(:,vec*3+1)-favg;
a=0.005*sum(b.*b,1)
if a<0.002
for i=1:200
   P(i,1)=u*P(i,1)*(1-P(i,1));
   P(i,2)=u*P(i,2)*(1-P(i,2));
end
end
end

[P(1,vec*2+1),P(1,vec*2+2)]  

Csp=P(:,vec*2+1)  %********%
Csn=P(:,vec*2+2)
open_system('SP2D_2');
set_param('SP2D_2/Subsystem/Csp','Gain','Csp');
set_param('SP2D_2/Subsystem1/Csn','Gain','Csn');
[t_time,x_state,y_out]=sim('SP2D_2',[0,36658]);
BP=0:36658; %x轴范围
h=plot(X,Y,'r*',BP,Voltage,'b');
xlabel('x')
ylabel('Logistic')
title('2参数与样本比较 ')
legend('样本','估计函数')
p_size=size(P);
%x_size=size(X);
y_size=size(Y);
for j=1:36659%对每个样本点
M(j)=Y(j)-Voltage(j);
end
ma=max(abs(M))%最大误差
mi=min(abs(M))%最小误差
rmse=(sum(M.*M,2)/points)^0.5%均方根误差
%----------------------适应值函数
function y = Fitness(P,Y,Voltage)
%最小二乘估计适应值函数
%以误差二乘方和作为适应值,目标是最小化适应值
p_size=size(P);
y_size=size(Y);

%结果
y=zeros(p_size(1),1);
for i=1:p_size(1)%对每个粒子
for j=1:36659%对每个样本点
y(i)=y(i)+(Y(j)-Voltage(j))^2;
end
end
end


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表