syms a b s;
e=0.01;
f=a^2+25*b^2;
x0=[3;2];
for i=1:20
xd=[diff(f,a);diff(f,b)];
x1=[x0(1)-s*xd(1);x0(2)-s*xd(2)];
fai=(x0(1)-s*xd(1))^2+25*(x0(2)-s*xd(2))^2;
faid=diff(fai,s);
ss=solve(faid);
x11=subs(x0(1)-s*x1d,s,ss);
x12=subs(x0(2)-s*x2d,s,ss);
xk=[x11;x12];
e1= (xk(1)-x0(1))^2+(xk(2)-x0(2))^2;
if e1<=e
x=[xk(1);xk(2)];
return;
else
x0=[xk(1);xk(2)];
end
opt_x=xk;
end
你好,需要改的地方帮你改正了,现在梯度下降法可以运行了:
syms a b s;
e=0.01;
f=a^2+25*b^2;
x0=[3;2];
xd=[diff(f,a);diff(f,b)];
for i=1:20
xd_val = subs(xd,[a,b],[x0(1),x0(2)]);% 下降的方向
fai=(x0(1)-s*xd(1))^2+25*(x0(2)-s*xd(2))^2;
faid=diff(fai,s);
ss=solve(faid,s);
ss = subs(ss,[a,b],[x0(1),x0(2)]); % ss里面含有的a和b需要x0替换掉
x11=subs(x0(1)-s*xd_val(1),s,ss);
x12=subs(x0(2)-s*xd_val(2),s,ss);
xk=[x11;x12];
e1= (xk(1)-x0(1))^2+(xk(2)-x0(2))^2;
if eval(e1)<=e %加eval获取真实的数
x=[xk(1);xk(2)];
break;%这里用break打破循环即可
else
x0=[xk(1);xk(2)];
end
opt_x=xk;
end
x
eval(x)
有帮助还望题主给个采纳支持一下答主哦,谢谢啦