📄 grad_2d.m
字号:
function [optim_fx,x,step]=grad_2d(x0,e)
syms x1 x2;%定义自变量x1,x2为符号变量(由于要用向量形式表示只能用x1,x2....xn等形式表示而不能用x,y,z等形式)
X=[x1,x2];
fx=X(1)^2+3*X(2)^2-X(1)*X(2);
fxd1=[diff(fx,x1) diff(fx,x2)];%分别求x1,x2的偏导数
%赋予x1,x2的初值
x=x0;
%e=0.0005;
a=1;
fan=subs(fxd1,[x1 x2],[x(1) x(2)]);%将x(1) x(2)即x1,x2的初值代入式fxd1中
g=0;%将偏导数的平方和小于某一数作为迭代停止的标准
for i=1:length(fan)
g=g+fan(i)^2;
end
g=sqrt(g);
step=0;
while g>e
step=step+1;
dk=-fan;
%点x(k)处的搜索步长
ak=(dk(1)^2+dk(2)^2)/(-2*dk(1)*dk(2)+2*dk(1)^2+3*dk(2)^2);%此式分母中中减去了两个偏导乘积这一项,是为了减小步长,按梯度法公式没有该项
xu=x+ak*dk;
x=xu;
%输出结果
optim_fx(step+1)=subs(fx,[x1 x2],[x(1) x(2)]);
fprintf(' x=[ %d %d ] optim_fx=%d\n',x(1),x(2),optim_fx);
%计算目标函数点x(k+1)处一阶导数值
fan=subs(fxd1,[x1 x2],[x(1) x(2)]);
g=0;
for i=1:length(fan)
g=g+fan(i)^2;
end
g=sqrt(g);
end
plot(1:step+1,optim_fx)
%输出结果
%optim_fx=subs(fx,[x1 x2],[x(1) x(2)]);
%fprintf('\n最速下降法\n结果:\n x=[ %d %d ] optim_fx=%d\n',x(1),x(2),optim_fx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -