在迭代方法计算全局最小值时,初始化没有问题,极小化目标函数的时候也没有问题,但是在调用填充函数极小化时候时候报错,显示:
源代码如下,
%主程序%
clear
clc
global x1 x;
x0=[-2,-1]';
[x1,val1,k1]=bfgs('fun1','gfun1',x0);
[x,val,k] = bfgsff('fun3','gfun3',x1);
disp('迭代次数:k=')
disp(k)
disp('最优解:x = ')
disp(x)
disp(['此时: f(x) = ',num2str(val)])
%极小化目标函数bfgs%
function [x1,val1,k] = bfgs(fun1,gfun1,x0,varargin)
k=0;
global x1;
maxk=1000;
rho=0.7;
sigma=0.4;
e=1e-5;%精度
n=length(x0);
Hk=eye(n);
while(k<maxk)
gk=feval(gfun1,x0,varargin{:});
if(norm(gk)<e),break;end
dk=-Hk\gk;%在后面会更新Hk
m=0;
mk=0;
while(m<20)
s=feval(fun1,x0+rho^mdk,varargin{:});
a=feval(fun1,x0)+sigmarho^mgk'*dk;
if(s<a)
mk=m;
break;
end
m=m+1;
end
x1=x0+dk*rho^mk;
sk=x1-x0;
yk=feval(gfun1,x1,varargin{:})-gk;
if(yk'*sk>0)
Hk=Hk-(Hksk*sk'Hk)/(sk'Hksk)+(ykyk')/(yk'*yk);
end
x0=x1;
k=k+1;
end
%极小化填充函数bfgsff%
function [x,val,k]=bfgsff(fun3,gfun3,x1,varargin)
k=0;
global x1;
global x;
maxk=1000;
rho=0.7;
sigma=0.4;
e=1e-5;%精度
n=length(x1);
Hk=eye(n);
while(k<maxk)
gk=feval(gfun3,x1,varargin{:});
if(norm(gk)<e),break;end
dk=-Hk\gk;%在后面会更新Hk
m=0;
mk=0;
while(m<20)
s=feval(fun3,x1+rho^mdk,varargin{:});
a=feval(fun3,x1)+sigmarho^mgk'*dk;
if(s<a)
mk=m;
break;
end
m=m+1;
end
x=x1+dk*rho^mk;
sk=x-x1;
yk=feval(gfun3,x,varargin{:})-gk;
if(yk'*sk>0)
Hk=Hk-(Hksk*sk'Hk)/(sk'Hksk)+(ykyk')/(yk'*yk);
end
x1=x;
k=k+1;
end
val=feval(fun3,x1,varargin{:});
end