利用 MATLAB 编程实现直接法求解无约束最优化问题(坐标轮换法、模式搜索法、单纯形法、Powell 改进的方向加速法)
本文章包含以下内容:
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 1xk=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
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 1xk=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
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+1break;end
end
while(1)%step 1fl=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)fh) %比最大的大g=h; %最大变为次大xg=xh;fg=fh;h=k;xh=s(k,:);fh=fx(k);elseif(fx(k)>fg)g=k;xg=s(k,:);fg=fx(k);endendk=k+1;if k>n+1break;endend%得到x_,fx_x_=(sum(s)-xh)/n;fx_=f(x_);k=1;error=0;while(1) %得到errorerror=error+(fx(k)-fx_)^2;k=k+1;if k>n+1error=(error/(n+1))^0.5;break;endendif(errorn+1break;endendendendend
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 2xk=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(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 7while(1)p(m,:)=p(m+1,:);if(m
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_));
结果:

可以明显地看出,四种方法的准确性是逐渐上升的
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
