clc;clear;
syms x1x2 v
f = x1^2+2*x2^2-4*x1-2*x1*x2;
% f =x1^3+x2^3-3*x1*x2; %测试函数
x =[2,2]; %设置初始点
afx =[diff(f,x1),diff(f,x2)]; %求出一阶偏导
a2fx=[diff(afx(1),x1),diff(afx(1),x2);diff(afx(2),x1),diff(afx(2),x2)]; %求出二阶偏导
g =subs(afx,[x1,x2],x); %计算一阶偏导在x处的值
s = -g;
while(1)
if sum(g.^2)<0.01 %迭代终止条件
disp('共轭梯度法求函数极小点为:')
x = double(x); %将sym型转化为double型
disp(sprintf('(%f,%f)',x(1),x(2))) %打印计算结果
break;
end
ff = subs(f,[x1,x2],x+v*s); %将f用v表示
dfv = diff(ff,v); %将ff对v求导
if diff(dfv,v)==0
disp('无最优解');break;
else
vv = solve(dfv == 0);
fff = subs(ff,v,vv);
vv0 = find(vv>0);
vv = vv(find(fff == min(fff(vv0)))); %求出使得fff最小的非负vv值
end
x = x+vv*s; %求出新的x的值
y1 = subs(ff,v,vv);
g1 = subs(afx,[x1,x2],subs(x,v,vv)); %求出一阶偏导的值
v1 = sum(g1.^2)/sum(g.^2);
s = -g1+v1*s;
g = g1;
end
程序输出结果:
共轭梯度法求函数极小点为:
(4.000000,2.000000)