共轭梯度法
线性共轭梯度法
线性共轭梯度法程序
function[k,x,val]=linecg(A,b,x0,epsilon,N)
if nargin<5
N=1000;
end
if nargin<4
epsilon=1.e-5;
end
if nargin<3
x0=zeros(length(b),1);
end
k=0;
gk=A*x0-b;
dk=-gk;
while(k<N)
temp=A*dk;
alpha=-gk'*dk/(dk'*temp);
x=x0+alpha*dk;
gk=A*x-b;
betak=gk'*temp/(dk'*temp);
dk=-gk+betak*dk;
if(norm(gk)<epsilon),
break;
end
x0=x;
k=k+1;
end
val=0.5*x'*A*x-b'*x;
测试文件
clear;
clc;
N=5;
A=[4 -1 0 0 0
-1 4 -1 0 0
0 -1 4 -1 0
0 0 -1 4 -1
0 0 0 -1 4];
b=[3;2;2;2;3];
x0=zeros(5,1);
epsilon=1e-5;
[k,x,val]=linecg(A,b,x0,epsilon,N)
输出结果
FR非线性共轭梯度法
目标函数
function f=fun(x)
f=2*x(1)^2+x(2)^2-2*x(1)*x(2)-2*x(2);
梯度
function gf=gfun(x)
gf=[4*x(1)-2*x(2);2*x(2)-2*x(1)-2];
FR非线性共轭梯度法程序
function[k,x,val]=frcg(fun,gfun,x0,epsilon,N)
if nargin<5
N=1000;
end
if nargin<4
epsilon=1.e-5;
end
beta=0.6;
sigma=0.4;
n=length(x0);
k=0;
while(k<N)
gk=feval(gfun,x0);
itern=k-(n+1)*floor(k/(n+1));
itern=itern+1;
if(itern==1)
dk=-gk;
else
betak=(gk'*gk)/(g0'*g0);
dk=-gk+betak*d0;
gd=gk'*dk;
if(gd>=0.0)
dk=-gk;
end
end
if(norm(gk)<epsilon),
break;
end
m=0;
mk=0;
while(m<20)
if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
mk=m;
break;
end
m=m+1;
end
x=x0+beta^mk*dk;
g0=gk;
d0=dk;
x0=x;
k=k+1;
end
val=feval(fun,x);
测试文件
clear;
clc;
x0=[0.0;0.0];
[k,x,val]=frcg(fun,gfun,x0)
运行结果…[真是一点点差别,查错查好久,又好迷]