MATLAB提示的错误看不懂,x有10行,x-1有10列,前后行列不是相等的吗,为什么除不了呢?
用点乘和点除 .* 和 ./
function y=f(x)
global s;
if(length(x)==1)
global xk;
global pk;
x=xk+x*pk;
end
y=x(1)^2+x(2)^2+s*(x(1)+x(2)-2)^2;
function xk=waifanhanshufa(e,x)
%step 1
c=10;
global s;
s=1;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
H=[1 0;0 1];
xk=DFP_hjfg(1e-4,xk,H);
if s*(xk(1)+xk(2)-2)^2<e
return ;
end
s=c*s;
end
function y=f(x)
global r;
if(length(x)==1)
global xk;
global pk;
x=xk+x*pk;
end
y=x(1)^2+x(2)^2+r/(x(1)-1);
不限制一维搜索步长
function xk=neifanhanshufa(e,x)
%step 1
c=0.1;
global r;
r=10;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
%拟牛顿法
Hk=[1 0;0 1];
xk=DFP_hjfg(1e-6,xk,Hk);
if r/(xk(1)-1)<e
return ;
end
r=c*r;
end
限制一维搜索步长(这里更改了拟牛顿法函数,原函数还是看之前的代码)
function xk=neifanhanshufa(e,x)
%step 1
c=0.1;
global r;
r=10;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
%拟牛顿法
Hk=[1 0;0 1];
xk=DFP_hjfg(1e-6,xk,Hk);
if r/(xk(1)-1)<e
return ;
end
r=c*r;
end
function x_=DFP_hjfg(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
%step 2
pk=-(Hk*g0')'; %默认都是列向量
%step 3
%这两个函数见之前代码(matlab无约束最优化的一般算法)
c_=-(xk(1)-1)/([1,0]*pk');
a=huangjinfenge(0,abs(c_),10^-4);
%step 4
xk=x+a*pk;
g1=shuzhiweifenfa(xk);
%step 5
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
x_=xk;
return;
end
if sqrt(sum((x-xk).^2))<=e
x_=xk;
return;
end
sk=(a*pk)'; %x(k+1)-x(k)=a*pk
yk=(g1-g0)';
%step 6
Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk);
g0=g1;
x=xk;
end
结果示例: