本文章包含以下内容:
1、画出单纯形法的算法流程图;
2、MATLAB 编写坐标轮换法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);
3、MATLAB 编写模式搜索法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);
4、MATLAB 编写单纯形法求解无约束优化问题的函数(函数式 M 文件,精 度设为 epson 可调);
5、MATLAB 编写 Powell 改进的方向加速法求解无约束优化问题的函数,利 用黄金分割算法精确一维搜索(函数式 M 文件,精度设为 epson 可调);
6、MATLAB 编写程序(命令式 M 文件),分别调用 2-5 定义的 M 文件,求解 如下问题:
精度为 0.001,初始点为(-1,1)。
一维搜索,进退法,黄金分割法代码链接
本实验中函数用单独function计算
function y=f(x)
if(length(x)==1)
global xk;
global pk;
x=xk+x*pk;
end
y=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
1、画出单纯形法的算法流程图;
2、坐标轮换法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);
function xk=zuobiaolunhuan(e,x)
global xk;
global pk;
%step 0
%n为函数变量数。
n=length(x);
p=eye(n); %n阶单位矩阵
%没用到k,只存储当前迭代的值。
while 1
%step 1
xk=x;
i=1;%控制循环
while 1
%行向量因为之前写的黄金分割默认行向量。
%取得单位向量
pk=p(i,:);
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
xk=xk+a*pk;
if(i<n)
i=i+1;
else
break;
end
end
%step 2
%范数用的是平方和开根号
if sqrt(sum((xk-x).^2))<=e
return;
end
x=xk;
%没用到k,只存储当前迭代的值。
end
3、模式搜索法求解无约束优化问题的函数,利用黄金分割算 法精确一维搜索(函数式 M 文件,精度设为 epson 可调);
function xk=moshisousuo(e,x)
global xk;
global pk;
%step 0
%n为函数变量数。
n=length(x); %变量数
p=eye(n); %n阶单位矩阵
%没用到k,只存储当前迭代的值。
while 1
%step 1
xk=x;
i=1;%控制循环
while 1
%行向量因为之前写的黄金分割默认行向量。
%取得单位向量
pk=p(i,:);
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
xk=xk+a*pk;
if(i<n)
i=i+1;
else
break;
end
end
%step 2
%范数用的是平方和开根号
if sqrt(sum((xk-x).^2))<=e
return;
end
pk=xk-x;
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
xk=xk+a*pk;
%step 3
x=xk;
%没用到k,只存储当前迭代的值。
end
4、单纯形法求解无约束优化问题的函数(函数式 M 文件,精 度设为 epson 可调);
function xk=danchunxingfa(e,x)
%step 0
b=0.5;
r=2;
n=length(x); %变量数
p=eye(n); %n阶单位矩阵
p=[0,0;p];
fx(n+1)=0; %储存fx
s=zeros(n+1,n);
k=1;
while(1)%构造单纯形
s(k,:)=x+p(k,:);
fx(k)=f(s(k,:));
k=k+1;
if k>n+1
break;
end
end
while(1)
%step 1
fl=Inf;
fh=-Inf;
fg=-Inf;
l=0;
h=0;
g=0;
xl(n)=0;
xh(n)=0;
xg(n)=0;
k=1;
while(1) %得到xl,xh,xg;
if(fx(k)<fl) %最小的
l=k;
xl=s(k,:);
fl=fx(k);
end
if(fx(k)>fh) %比最大的大
g=h; %最大变为次大
xg=xh;
fg=fh;
h=k;
xh=s(k,:);
fh=fx(k);
else
if(fx(k)>fg)
g=k;
xg=s(k,:);
fg=fx(k);
end
end
k=k+1;
if k>n+1
break;
end
end
%得到x_,fx_
x_=(sum(s)-xh)/n;
fx_=f(x_);
k=1;
error=0;
while(1) %得到error
error=error+(fx(k)-fx_)^2;
k=k+1;
if k>n+1
error=(error/(n+1))^0.5;
break;
end
end
if(error<e)
xk=xl;
return;
end
%step 2
xm=2*x_-xh;
fm=f(xm);
if(fm<fl)
xe=x_+r*(xm-x_);
fe=f(xe);
if(fe<fl)
xh=xe;
else
xh=xm;
end
s(h,:)=xh; %修改单纯形和fx
fx(h)=f(xh);
else
if(fm<fg)
xh=xm;
s(h,:)=xh; %修改单纯形和fx
fx(h)=f(xh);
else
if(fm<fh)
xc=x_+b*(xm-x_);
fc=f(xc);
else
xc=x_+b*(xh-x_);
fc=f(xc);
end
if(fc<fh)
xh=xc;
s(h,:)=xh; %修改单纯形和fx
fx(h)=f(xh);
else
k=1;
while(1)%构造新单纯形
s(k,:)=xl+(s(k,:)-xl)/2;
fx(k)=f(s(k,:));%计算新的fx
k=k+1;
if k>n+1
break;
end
end
end
end
end
end
5、 Powell 改进的方向加速法求解无约束优化问题的函数,利用黄金分割算法精确一维搜索(函数式 M 文件,精度设为 epson 可调);
function xk=Powell(e,x)
global xk;
global pk;
%step 1
%n为函数变量数。
n=length(x); %变量数
p=eye(n); %n阶单位矩阵
fx(n+1)=0;
fx(1)=f(x);
%没用到k,只存储当前迭代的值。
%step 1
while 1
%step 2
xk=x;
i=1;%控制循环
m=0;
d=-Inf;
while 1
%行向量因为之前写的黄金分割默认行向量。
%取得方向向量
pk=p(i,:);
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
xk=xk+a*pk;
fx(i+1)=f(xk);
fx_f=fx(i)-fx(i+1); %方便算德尔塔
if(d<fx_f) %求出d和m
m=i;
d=fx_f;
end
%step 3(控制循环)
if(i<n)
i=i+1;
else
break;
end
end
%step 4
%范数用的是平方和开根号
xk_x=sqrt(sum((xk-x).^2));%方便算pn
if xk_x<=e
return;
end
%step 5
f_=f(2*xk-x);
%step 6
if((f_>=fx(1))|(fx(1)-2*fx(n+1)+f_)*(fx(1)-fx(n+1)-d)^2>=0.5*(fx(1)-f_)^2*d)
fx(1)=fx(n+1);
x=xk;
else
%step 7
while(1)
p(m,:)=p(m+1,:);
if(m<n-1)
m=m+1;
else
break;
end
end
p(n,:)=(xk-x)/xk_x;
%step 8
pk=p(n,:);
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
x=xk+a*pk;
fx(1)=f(x);
end
end
6、程序(命令式 M 文件),分别调用 2-5 定义的 M 文件,求解 如下问题:
精度为 0.001,初始点为(-1,1)。
clear
clc
x=[-1,1];
e=0.001;
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('e= %f\n',e);
fprintf('=========================\n');
fprintf('坐标轮换法:\n');
x_=zuobiaolunhuan(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('=========================\n');
fprintf('模式搜索法:\n');
x_=moshisousuo(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('=========================\n');
fprintf('单纯形法:\n');
x_=danchunxingfa(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('=========================\n');
fprintf('Powell 改进的方向加速法:\n');
x_=Powell(e,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
结果:
可以明显地看出,四种方法的准确性是逐渐上升的