⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grad_2d.m

📁 梯度法
💻 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 + -