📄 danchunxing.m
字号:
%单纯形算法
%************************************************************************%
function danchunxing(func,x)
%input like this:x=[0,0;1,0;0,1],danchunxing(x);
x0=x;
u=1;r=2;e=0.5;t0=1e-10;
count=0;
xmid=zeros(1,size(x0,2));
xref=zeros(1,size(x0,2));
xdec=zeros(1,size(x0,2));
xt=zeros(1,size(x0,2));
A=zeros(1,size(x0,1));
for i=1:length(A)
A(:,i)=func(x0(i,:));
end
x0=s_sort(func,x0,A);
xmid=fun_mid(x0);
while fun_judge(func,x0,xmid)>t0 %判断是否达到要求的精度
x0=s_sort(func,x0,A);
xmid=fun_mid(x0); %求解形心
xref=fun_ref(xmid,x0(1,:),u); %求解反射点
if func(xref)<func(x0(end,:))
xexp=fun_exp(xmid,xref,r); %扩张算子
if func(xexp)<func(xref)
x0(1,:)=xexp;
else
x0(1,:)=xref;
end
else if func(xref)<=func(x0(2,:))
x0(1,:)=xref;
else if func(x0(1,:))>func(xref)
xt=xref;
else
xt=x0(1,:);
end
xdec=fun_dec(xmid,xt,e); %压缩算子
if func(xdec)<=func(xt)
x0(1,:)=xdec;
else
x0=fun_x_dec(x0,x0(end,:)); %整体收缩
end
end
end
count=count+1;
end
xmin=x0(end,:),fmin=func(x0(end,:)),count
%*************************************************************************%
function x_judge=fun_judge(func,x,x_mid) %迭代停止条件函数
x_d=0;
for i=1:size(x,1)
x_d=x_d+(func(x(i,:))-func(x_mid))^2;
end
x_judge=sqrt(1./(size(x,2)+1)*x_d);
%*************************************************************************%
function x_s=s_sort(func,x,D) %数组排序函数,求解最大值
xm=zeros(1,size(x,2)); %最小值及次大值
for i=1:length(D)
D(:,i)=func(x(i,:));
end
for i=1:length(D)
for j=1:length(D)-i
if D(j)<D(j+1)
t=D(j);
D(j)=D(j+1);
D(j+1)=t;
xm(1,:)=x(j,:);
x(j,:)=x(j+1,:);
x(j+1,:)=xm(1,:);
end
end
end
x_s=x;
%*************************************************************************%
function x_mid=fun_mid(x) %求解形心函数
xmt=zeros(1,size(x,2));
for i=2:size(x,1)
xmt=xmt+x(i,:);
end
x_mid=xmt./(size(x,1)-1);
%*************************************************************************%
function x_ref=fun_ref(x_mid,x_max,u_r) %求解反射点
x_ref=x_mid+u_r*(x_mid-x_max);
%*************************************************************************%
function x_exp=fun_exp(x_mid,x_ref,r_e) %扩展函数
x_exp=x_mid+r_e*(x_ref-x_mid);
%*************************************************************************%
function x_dec=fun_dec(x_mid,xt,e_d) %压缩函数
x_dec=x_mid+e_d*(xt-x_mid);
%*************************************************************************%
function x_dec_d=fun_x_dec(x,x_min) %收缩函数
for i=1:size(x,1)
x(i,:)=x(i,:)+0.5*(x_min-x(i,:));
end
x_dec_d=x;
%*************************************************************************%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -