📄 conjugate_grad_2d.m
字号:
function [optim_fx,x,step]=conjugate_grad_2d(x0,e)
%please input this:conjugate_grad_2d([2,2],0.05)
%e=0.005;%设置导数的最小限
%x0=[2,2];%设置初始值
x=x0;
syms xi yi a
%f=xi^2-xi*yi+3*yi^2;
%高斯函数:
f=sin(sqrt(xi^2+yi^2)+eps)/(xi^2+yi^2);
fx=diff(f,xi);%分别求偏导
fy=diff(f,yi);
fx=subs(fx,{xi,yi},x0);
fy=subs(fy,{xi,yi},x0);
fi=[fx,fy];
step=0;
while double(sqrt(fx^2+fy^2))>e
s=-fi;
if step<=0%即第一次迭代共轭方向即为梯度方向,以后就用共轭方向
s=-fi;
else
s=s1;
end
x=x+a*s;%a为步长
fa=subs(f,{xi,yi},x);
f1=diff(fa);
f1=solve(f1);%即求取f1=0的解,即导数为0时的步长,可得到步长f1。
if f1~=0%若求出步长为0说明已经收敛,否则继续迭代
ai=double(f1);
else
return
x,optim_fx=subs(f,{xi,yi},x),step
end
x=subs(x,a,ai);%得到x(k+1)
fxi=diff(f,xi);
fyi=diff(f,yi);
fxi=subs(fxi,{xi,yi},x);
fyi=subs(fyi,{xi,yi},x);
fii=[fxi,fyi];
d=(fxi*(fxi-fx)+fyi*(fyi-fy))/(fx^2+fy^2);%求系数Bk。分母为g(k+1)的平方和,分子为g(k)的平方和
s1=-fii+d*s;%求取共轭方向
step=step+1;
fx=fxi;
fy=fyi;
optim_fx=subs(f,{xi,yi},x);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -