基于PSO粒子群优化的汽车刹车稳定性数据matlab仿真与分析

218 篇文章 55 订阅
该博客介绍了使用MATLAB进行数据处理,包括利用多项式拟合和粒子群优化(PSO)算法对实验数据进行分析。内容涉及去除异常点、多项式拟合、误差分析以及稳定性评估。通过PSO优化拟合,得出最佳拟合曲线,并通过统计量计算找出最稳定的测试温度区间。
摘要由CSDN通过智能技术生成

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程

目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

刹车类别A

温度1

测试1

测试2

.......

测试n

温度3

测试1

测试2

.......

测试n

.......

.......

温度N

测试1

测试2

.......

测试n

        每次测试的温度间隔,根据实际操作的可行性,来选择。这个无所谓,从里面看到温度从20多度到60度,如果条件允许,可以再将温度扩展一下。即测试的温度范围再大点。然后,对于同一个温度,测试次数的确定,如果你每次测试的数值差别较大,那么测试次数最好多点,如果每次测试的差别不大,那么测试20次就够了。

      粒子群优化(PSO)算法是通过模拟鸟群觅食过程中的迁徙和群聚行为而提出的一种基于群体智能的全局随机搜索算法。PSO是将群体(swarm)中的个体看作是在D维搜索空间中没有质量和体积的粒子(particle),每个粒子以一定的速度在解空间运动,并向自身历史最佳位置pbest和邻域历史最佳位置聚集,实现对候选解的进化。

       PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。所有的粒子都有一个由被优化的函数决定的适值( fitness value),每个粒子还有一个速度决定它们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

       PSO初始化为一群随机粒子,然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。

二、核心程序

................................................................
parameter;
ishow = (get(handles.checkbox1,'Value'));
if choice == 1
L2    = func_anti_noise(L1,T1);
else
L2    = func_anti_noise(L1,T2);    
end
hold off;
axes(handles.axes4);
color_table;
for i = 1:len1
    str = colors{i};
    plot(L2(i,:),str);
    hold on;
end
if ishow == 1
    figure;
    color_table;
    for i = 1:len1
        str = colors{i};
        plot(L2(i,:),str);
        hold on;
    end
    title('Leaks anti noise');
end 


% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%多项式拟合%%%%%%%%%%%
parameter;
ishow            =        (get(handles.checkbox1,'Value'));
KK               = str2num(get(handles.edit1,'String')); 
 
if choice == 1
[y1,x1,y0,x0,P1fit] =  func_fit_means(T1,L2,KK);
else
[y1,x1,y0,x0,P1fit] =  func_fit_means(T2,L2,KK);    
end

hold off;
axes(handles.axes5);
plot(x0,y0,'o');
hold on;
plot(x1,y1,'r','LineWidth',1);
hold on;
 
if ishow == 1
    figure;
    plot(x0,y0,'o');
    hold on;
    plot(x1,y1,'r','LineWidth',1);
    hold on;
    title('多项式拟合曲线');
    
end 

%计算拟合误差
err1 = func_error(y0,x0,y1,x1);
set(handles.edit2,'string',num2str(err1)); 




% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最大值多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最大值多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最大值多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最大值多项式拟合%%%%%%%%%%%
parameter;
ishow            =        (get(handles.checkbox1,'Value'));
KK               = str2num(get(handles.edit1,'String')); 
if choice == 1
[y1max,x1max,y0max,x0max,P1max] =  func_fit_max(T1,L2,KK);
else
[y1max,x1max,y0max,x0max,P1max] =  func_fit_max(T2,L2,KK);    
end
hold off;
axes(handles.axes5);
plot(x0,y0,'o');
hold on;
plot(x1,y1,'r','LineWidth',1);
hold on;
plot(x1max,y1max,'g','LineWidth',1);
hold on; 
if ishow == 1
    figure;
    plot(x0,y0,'o');
    hold on;
    plot(x1,y1,'r','LineWidth',1);
    hold on;
    plot(x1max,y1max,'g','LineWidth',1);
    hold on; 
    title('多项式拟合曲线');
end 






function pushbutton6_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最小值多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最小值多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最小值多项式拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最小值多项式拟合%%%%%%%%%%%
parameter;
ishow            =        (get(handles.checkbox1,'Value'));
KK               = str2num(get(handles.edit1,'String')); 
if choice == 1
[y1min,x1min,y0min,x0min,P1min] =  func_fit_min(T1,L2,KK);
else
[y1min,x1min,y0min,x0min,P1min] =  func_fit_min(T2,L2,KK);    
end
hold off;
axes(handles.axes5);
plot(x0,y0,'o');
hold on;
plot(x1,y1,'r','LineWidth',1);
hold on;
plot(x1max,y1max,'g','LineWidth',1);
hold on; 
plot(x1min,y1min,'m','LineWidth',1);
hold on; 
if ishow == 1
    figure;
    plot(x0,y0,'o');
    hold on;
    plot(x1,y1,'r','LineWidth',1);
    hold on;
    plot(x1max,y1max,'g','LineWidth',1);
    hold on; 
    plot(x1min,y1min,'m','LineWidth',1);
    hold on; 
    title('多项式拟合曲线');
    
end 


% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PSO优化拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PSO优化拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PSO优化拟合%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PSO优化拟合%%%%%%%%%%%
parameter;
ishow            =        (get(handles.checkbox1,'Value'));
KK               = str2num(get(handles.edit1,'String')); 


%进行PSO优化
[V_score2,PP2] = func_pso(P1fit,x1,y0,x0);
ypso           = polyval(PP2,x1);

hold off;
axes(handles.axes6);
plot(V_score2,'Linewidth',2);



hold off;
axes(handles.axes7);
plot(x0,y0,'o');
hold on;
plot(x1,y1,'r','LineWidth',1);
hold on;
plot(x1max,y1max,'g','LineWidth',1);
hold on; 
plot(x1min,y1min,'m','LineWidth',1);
hold on; 
plot(x1,ypso,'k--','LineWidth',2);
hold on; 

if ishow == 1
    figure;
    subplot(121);
    plot(V_score2,'Linewidth',2);
    xlabel('迭代次数');
    ylabel('拟合误差优化过程');
    subplot(122);
    plot(x0,y0,'o');
    hold on;
    plot(x1,y1,'r','LineWidth',1);
    hold on;
    plot(x1max,y1max,'g','LineWidth',1);
    hold on; 
    plot(x1min,y1min,'m','LineWidth',1);
    hold on; 
    plot(x1,ypso,'k--','LineWidth',2);
    hold on; 
    title('多项式拟合曲线');
    legend('实际测量值','均值拟合曲线','最大测量值拟合曲线','最小测量值拟合曲线','优化后拟合曲线');
end 

err2 = func_error(y0,x0,ypso,x1);
set(handles.edit3,'string',num2str(err2)); 


% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%统计量计算%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%统计量计算%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%统计量计算%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%统计量计算%%%%%%%%%%%
parameter;

%计算均值和方差,将这两个计算结果存放到四个变量的后两位
for i = 1:size(T1,1)
    %计算均值
    E1(i) = mean(T1(i,:));
    E2(i) = mean(T2(i,:));
    E3(i) = mean(P1(i,:));
    E4(i) = mean(L2(i,:));
    %计算标准差
    D1(i) = std(T1(i,:));
    D2(i) = std(T2(i,:));
    D3(i) = std(P1(i,:));
    D4(i) = std(L2(i,:));    
    %计算方差
    V1(i) = var(T1(i,:));
    V2(i) = var(T2(i,:));
    V3(i) = var(P1(i,:));
    V4(i) = var(L2(i,:)); 
end

figure(10);
plot(E1,E4,'b-o');
hold on;
plot(E1,D4,'r-o');
hold on;
plot(E1,V4,'k-o');
legend('均值','标准差','方差');


fid = fopen('statistics.txt','wt');
fprintf(fid,'均值       标准差     方差\n');
for i = 1:length(E4)
    fprintf(fid,'%f   ',E4(i));
    fprintf(fid,'%f   ',D4(i));
    fprintf(fid,'%f   ',V4(i));
    fprintf(fid,'\n');
end
fclose(fid);


% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton9 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%拟合统计分析%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%拟合统计分析%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%拟合统计分析%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%拟合统计分析%%%%%%%%%%%
parameter;
ishow            =        (get(handles.checkbox1,'Value'));

hold off;
axes(handles.axes8);
plot(x0,y0,'o');
hold on;
plot(x1,ypso,'k--','LineWidth',2);
hold on; 
%找到最接近0的温度
Best_tmp = 0;
Ind      = 0;
for i = 2:length(ypso)-1
    if ypso(i-1) < 0 & ypso(i)>=0   
       Best_tmp = x1(i);
       Ind      = i;
    end   
end
plot(x1(Ind),-4:0.01:8,'r','LineWidth',1);
hold on; 
plot(x1,ypso(Ind),'r','LineWidth',1);


%根据统计量分析
%找到均值最小的值
Tmpes          = abs(E4);
[V,I]          = sort(Tmpes);
Best_Team_mean = I(1);

%找到均值最小的值
Tmpes          = abs(D4);
[V,I]          = sort(Tmpes);
Best_Team_std  = I(1);

if  ishow == 1
    figure(11);
    subplot(121);
    plot(x0,y0,'o');
    hold on;
    plot(x1,ypso,'k--','LineWidth',2);
    hold on; 
    plot(x1(Ind),-4:0.01:8,'r','LineWidth',1);
    hold on; 
    plot(x1,ypso(Ind),'r','LineWidth',1); 
    axis square;
    
    subplot(122)
    plot(E1(Best_Team_mean),E4(Best_Team_mean),'--rs','MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',10);
    hold on;
    plot(E1,E4,'b-o'); 
    hold on;
    plot(E1(Best_Team_std),D4(Best_Team_std),'--rs','MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',10);
    hold on;
    plot(E1,D4,'k-o');       
    hold on;
    axis square;
    legend('均值','标准差');
end

if Best_Team_mean == Best_Team_std 
   msgbox(['最稳定温度为:',num2str(Best_tmp),' 对应的测试组为:',num2str(Best_Team_mean)]);
else
   msgbox(['最稳定温度为:',num2str(Best_tmp),' 对应的测试组为:',num2str(Best_Team_mean),' 和 ',num2str(Best_Team_std)]); 
end

三、测试结果

 1:显示EXCEL中的数据,将EXCEL导入MATLAB,然后显示出其中的数据:

 

2:3:显示两个温度和泄漏之间对应关系图,这个是根据样本直接显示的

4:显示多个LEAK的样本值:

5:去掉LEAK样本中的一些异常采样点:

 

6:多项式拟合效果显示:

7:粒子群优化后的误差收敛曲线

8:粒子群优化后的多项式拟合效果:

9:最后的稳定性分析结果:

左图是根据优化拟合结果,得到实际中最有可能为稳定区域的温度值,如上面的对话框为31.43.

但是这个在实际中可能没法测试到。

所以上图中右图就是表示的这个情况,通过均值和方差最小化,得到测试组13和14两个测试温度区域为最佳的区域。

通过分析,

在GUI上的数据显示区域,会自动对最佳的数据测试组显示the best的字样。

A28-13

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值