⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matlabthebest.txt

📁 基于matlab的单纯型法pid寻优
💻 TXT
字号:
function [MinX,MinY,k,adj]=Find_MinY_SM(X0,A,k_max,adj_max)
% MinX,MinY是求得的极值点,k_max主计算循环的上限,adj收敛准则,收敛容差adj_max;
% X0是需要传递的单纯形初点,可以是N维向量,A是边长; 
% adj是收敛判定值,程序中为了避免死循环定了k循环最大上限,Alfa、Beta、AL采用常用的系数
% 用户可以重新改写,目标函数是[z]=objectfunction(x),可以是任意n维的函数;
% Y_med,X_med计算中使用的过渡变量,X_n2,Y_n2是单纯形形心,X_n2,X_n3,X_n4,X_n5分别是
% 寻优过程中的探测点,可参考相关书籍;
N =length(X0);
MinX=zeros(1,N);
MinY=0.0;
Alfa=1.0;
Beta=0.5;
AL=2.0;
Y_n2=0.0;
Y_n3=0.0;
Y_n4=0.0;
Y_n5=0.0;
adj=1.0;
k=0.0;

X_n2=zeros(1,N);
X_n3=zeros(1,N);
X_n4=zeros(1,N);
X_n5=zeros(1,N);

Y_med=0.0;
X_med=zeros(1,N);

X_xu=zeros(N+1,N);
Y_xu=zeros(1,N+1);
X_chu=zeros(N+1,N);
Y_chu=zeros(1,N+1);

% 初始化并组建单纯形(N+1)个顶点,A是边长,N是目标函数的维度,
% X_chu是初始化单纯形各顶点坐标值,以距阵形式表示,X_xu是降序排列的顶点坐标;
P=A*(sqrt(N+1)+N-1)/(N*sqrt(2.));
Q=A*(sqrt(N+1)-1)/(N*sqrt(2.));
% 给顶点赋初数值;
X_chu(1,: )=X0; 
for i=2:N+1
for j=1:N
if(j==i-1)
X_chu(i,j)=X0(j)+P;
else
X_chu(i,j)=X0(j)+Q;
end 
end
end
for i=1:N+1
[Y_chu(i)]=objectfunction(X_chu(i,: ));
end
% 冒泡算法求顶点的目标函数最坏点、次坏点和最好点;变量X_xu,Y_xu是
% 降序后的单纯形顶点值; 同时避免和正则单纯形的空间有序顶点X_chu,Y_chu混淆!
X_xu=X_chu;
Y_xu=Y_chu;
i=N+1;
while((i>=2)&&(i<=(N+1)))
i=i-1;
for j=1:i
if((Y_xu(j))<(Y_xu(j+1)))
Y_med=Y_xu(j);
X_med=X_xu(j,: );
Y_xu(j)=Y_xu(j+1);
X_xu(j,: )=X_xu(j+1,: );
Y_xu(j+1)= Y_med;
X_xu(j+1,: )=X_med;
end
end 
end
%~~~~~~~~~~~~~~~~
% 进入主计算阶段
%~~~~~~~~~~~~~~~~
while((k<k_max)&&(adj>=adj_max))
%第一步,开始探测优化点:
k=k+1;
%开始求除最坏点外各顶点的形心,X_n2表示形心坐标:
%对形心坐标变量清零,每个循环进行一次!
X_n2=zeros(1,N);
%计算形心坐标!
for i=1:N
for j=2:N+1
X_n2(i)=X_n2(i)+X_xu(j,i)/N;
end
end
%计算收敛准则adj的数值
[Y_n2]=objectfunction(X_n2);
adj=0.0;
for i=1:N+1
adj=adj+(Y_n2-Y_xu(i))^2;
end
adj=sqrt(adj/(N+1));

% ~~~~~~开始反射、扩张、缩小和收缩过程~~~~~~~

%反射分析从这里开始:
X_n3=X_n2+Alfa*(X_n2-X_xu(1,: ));
[Y_n3]=objectfunction(X_n3);
%反射点小于单纯形最小值,扩张分析
if(Y_n3<=Y_xu(N+1))
X_n4=X_n2+AL*(X_n3-X_n2);
[Y_n4]=objectfunction(X_n4); 
if (Y_n4 <= Y_xu(N+1))
X_xu(1,: )=X_n4; 
else 
X_xu(1,: )=X_n3; 
end
end 

%反射点大于单纯形最小值但是小于次差点,更换点 ,准备返回第一步,继续反射! 
if((Y_n3>Y_xu(N+1))&&(Y_n3<Y_xu(2)))
X_xu(1,: )=X_n3;
end 

%反射点大于单纯形次差点但是小于最坏点,收缩分析!
if ((Y_n3>Y_xu(2))&&(Y_n3<Y_xu(1)))
X_n5=X_n2+Beta*(X_n3-X_n2);
[Y_n5]=objectfunction(X_n5); 
%判断Yn5数值或叠代或缩小,然后准备返回第一步,继续反射 
if (Y_n5<Y_xu(1))
%叠代
X_xu(1,: )=X_n5;
else 
%缩小
for i=1:N+1
X_xu(i,: )=X_xu(N+1,: )+0.5*(X_xu(i,: )-X_xu(N+1,: ));
end
end 
end

%反射点大于单纯形最坏点,收缩分析!
if (Y_n3>Y_xu(1))
% 收缩
X_n5=X_n2+Beta*(X_xu(1,: )-X_n2); 
[Y_n5]=objectfunction(X_n5); 
%判断Yn5数值或叠代或缩小,然后准备返回第一步,继续反射 
if (Y_n5<Y_xu(1))
X_xu(1,: )=X_n5;
else 
%缩小
for i=1:N+1
X_xu(i,: )=X_xu(N+1,: )+0.5*(X_xu(i,: )-X_xu(N+1,: ));
end
end 
end

%~~~~~~~反射、扩张、缩小和收缩过程程结束~~~~~~~

%对替换了顶点的单纯形排序,仅仅替换了一个顶点,所以排序一次就好
[Y_xu(1)]=objectfunction(X_xu(1,: ));
for j=1:N
if((Y_xu(j))<(Y_xu(j+1)))
Y_med=Y_xu(j);
X_med=X_xu(j,: );
Y_xu(j)=Y_xu(j+1);
X_xu(j,: )=X_xu(j+1,: );
Y_xu(j+1)= Y_med;
X_xu(j+1,: )=X_med;
end
end
end
%~~~~~~~~~~~~~~~~
% 主计算阶段结束
%~~~~~~~~~~~~~~~~
MinX=X_n2;
MinY=Y_n2;

%% 目标函数[z]=objectfunction(x) 
%% 例如:
%% function [z]=objectfunction(x)
%% z=0.0;
%% z=x(1)*x(1)+2*x(2)*x(2)-4*x(1)-2*x(1)*x(2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -