📄 fr.m
字号:
function [fm xm k]=fr(y,x,x0)
%FR共轭梯度算法求极小值。y为给定函数,x为函数变量,x0为搜索起始点
%返回值fm为极小值,xm为极小值点
syms t a b c d n k aa
y=a^2+4*b^2+c^2
x0=[1 0 1]'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=length(x0);
y0=subs(y,findsym(y),x0); %计算g0,y0
g=jacobian(y)';
g0=subs(g,findsym(g),x0)
p0=-g0;
k=0;
x1=x0+t*p0
y1=subs(y,findsym(y),x1)
[mi ma]=regdef(y1,t,0,1)
[fm tm]=golddiv(y1,t,mi,ma); %求x1点,,
x1=subs(x1,findsym(x1),tm)
y1=subs(y1,findsym(y1),tm) %y1
g1=subs(g,findsym(g),x1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k1=norm(g0); %梯度的模
k2=norm(x1-x0)/(norm(x0)+1); %自变量x的变化度
k3=abs(y1-y0)/(abs(y0)+1); %函数值y变化度
while((k1>=1)||(k2>=1e-5)||(k3>=1e-5))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
if(k>n)
k
bresk;
end
aa=((g1')*g1)/((g0')*g0)
p=-g1-aa*p0
if (abs(p'*g1)<1e-3)
p0=-g;
else
if(p'*g1>0)
p0=-p
k=k+1
else
p0=p
k=k+1
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x0=x1
y0=y1
g0=g1
x1=x0+t*p0
y1=subs(y,findsym(y),x1)
[mi ma]=regdef(y1,t,0,1)
[fm tm]=golddiv(y1,t,mi,ma) %求x1点,,
x1=subs(x1,findsym(x1),tm)
y1=subs(y1,findsym(y1),tm) %y1
g1=subs(g,findsym(g),x1)
k1=norm(g0); %梯度的模
k2=norm(x1-x0)/(norm(x0)+1); %自变量x的变化度
k3=abs(y1-y0)/(abs(y0)+1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fm=y1
xm=x1
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -