clc;clear;
syms x1x2 v
f =x1^2+x2^2+x1*x2-3*x1;
% f =x1^2+2*x2^2-4*x1-2*x1*x2; %测试函数1
% f =x1^3+x2^3-3*x1*x2; %测试函数2
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)]; %求出二阶偏导
while(1)
afxx = subs(afx,[x1,x2],x); %计算一阶偏导在x处的值
if sum(afxx.^2)<1e-3 %迭代终止条件
disp('阻尼牛顿法求函数极小点为:')
x = double(x); %将sym型转化为double型
fprintf('(%f,%f)\n',x(1),x(2)) %打印计算结果
break;
end
a2fxx = subs(a2fx,[x1,x2],x); %计算具体数值
if det(a2fxx)==0 %无最优解的判别条件
disp('无最优解');break;
end
s = -inv(a2fxx)*afxx';
y = subs(f,[x1,x2],x+v*s');
dyv = diff(y,v);
vv = solve(dyv==0);
fff = subs(y,v,vv);
vv0 = find(vv>0);
vv = vv(find(fff == min(fff(vv0)))); %求出使得fff最小的非负vv值
x = x+vv*s'; %求出新的x的值
end
程序输出结果:
阻尼牛顿法求函数极小点为:
(2.000000,-1.000000)