1、FR 共轭梯度法的算法流程图;
2、MATLAB 编写 FR 共轭梯度法求解无约束优化问题的函数,要求采用 黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设 为 epson 可调);
3、MATLAB 编写 n 步重新开始的 FR 共轭梯度法求解无约束优化问题的 函数,要求采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);
4、MATLAB 编写 FR 共轭梯度法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);
5、MATLAB 编写 n 步重新开始的 FR 共轭梯度法求解无约束优化问题的 函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函 数式 M 文件,精度设为 epson 可调);
6、MATLAB 编写程序(命令式 M 文件),分别利用精确搜索和不精确搜索 的共轭梯度法,求解如下问题:
精度为 0.001,初始点为(-1,1)。
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;
function xk=FR_hjfg(e,x)
global xk;
global pk;
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
%没用到k,只存储当前迭代的值。
xk=x;
while 1
%step 2
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
%step 3
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 4
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
return;
end
%step 5
b=(g1*g1')/(g0*g0');
pk=-g1+b*pk;
%step 6
%没用到k,只存储当前迭代的值。
g0=g1;
end
function xk=FR_n_hjfg(e,x,n)
global xk;
global pk;
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
k=1;
xk=x;
while 1
%step 2
%一维搜索求ak
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
%step 3
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 4
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
return;
end
%step 5
if(mod(k,n)==0)
pk=-g1;
else
b=(g1*g1')/(g0*g0');
pk=-g1+b*pk;
end
%step 6
k=k+1;
g0=g1;
end
function xk=FR_Wolfe(e,x)
global xk;
global pk;
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
%没用到k,只存储当前迭代的值。
xk=x;
while 1
%step 2
%一维搜索求ak
a=Wolfe_Powell(xk,pk);
%step 3
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 4
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
return;
end
%step 5
b=(g1*g1')/(g0*g0');
pk=-g1+b*pk;
%step 6
%没用到k,只存储当前迭代的值。
g0=g1;
end
function xk=FR_n_Wolfe(e,x,n)
global xk;
global pk;
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
k=1;
xk=x;
while 1
%step 2
%一维搜索求ak
a=Wolfe_Powell(xk,pk);
%step 3
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 4
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
return;
end
%step 5
if(mod(k,n)==0)
pk=-g1;
else
b=(g1*g1')/(g0*g0');
pk=-g1+b*pk;
end
%step 6
k=k+1;
g0=g1;
end
clear
clc
n=10;
x=[-1,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('n=%9f\n',n);
fprintf('=========================\n');
fprintf('精确搜索的共轭梯度法:\n');
x_=FR_hjfg(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的共轭梯度法:\n');
x_=FR_Wolfe(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('n步重新开始的精确搜索的共轭梯度法:\n');
x_=FR_n_hjfg(10^-3,x,n);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('n步重新开始的不精确搜索的共轭梯度法:\n');
x_=FR_n_Wolfe(10^-3,x,n);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));