matlab中lsqnonlin函数出错

使用lsqnonlin函数求解最优化问题,使用L-M算法,出现:
Warning: Options LevenbergMarquardt and LargeScale will be ignored in a future
release. Running Levenberg-Marquardt algorithm. To run the Levenberg-Marquardt
algorithm without this warning, set option Algorithm to 'levenberg-marquardt'
instead.
并且:
lsqnonlin stopped because the relative size of the current step is less than
the default value of the step size tolerance.
主函数:
function LM_solving_paras
X0=[240;480;100;100;0.5;0.1];
options=optimset('LargeScale','off','LevenbergMarquardt','on','Display','iter', 'MaxFunEvals',20000,'MaxIter',1000);
[x,nf,f_opt,flag,c]=lsqnonlin(@wucha,X0,[],[],options)

wucha函数
function E=wucha(x)
nx=7;
ny=7
rdx=(cmat(:,:,1)-x(2))/x(4); %cmat为7*7*2矩阵
rdy=(cmat(:,:,2)-x(1))/x(3);
cmmt=zeros(nx,ny,2);
cmmt(:,:,1)=cmat(:,:,1)+(cmat(:,:,1)-x(2))*(x(5)*rdx.^2+x(6)*rdx.^4);
cmmt(:,:,2)=cmat(:,:,2)+(cmat(:,:,2)-x(1))*(x(5)*rdy.^2+x(6)*rdy.^4);
E=zeros(nx,1);
% for i=1:nx
% fenmu=sqrt((kb(i,1))^2+1);sum=0
% for l=1:ny
% fenzi=abs(kb(i,1)*cmat(i,l,1)-cmat(i,l,2)+kb(i,2));
% sum=sum+fenzi;
% end
% E(i)=sum/fenmu;
% end
% EE=sum(E);
for i=1:nx
a=sum(cmmt(i,:,1).^2)-1/ny*(sum(cmmt(i,:,1)))^2;
b=sum(cmmt(i,:,1).*cmmt(i,:,2))-1/ny*sum(cmmt(i,:,1))*sum(cmmt(i,:,2));
c=sum(cmmt(i,:,2).^2)-1/ny*(sum(cmmt(i,:,2)))^2;
alapha=a-c; beta=alapha/2/sqrt(alapha^2+4*b^2);
sinfai=sqrt(0.5-beta);cosfai=sqrt(0.5+beta);
if sinfai*b<0
sinfai=-sinfai;
end
E(i)=a*sinfai^2-2*abs(b)*abs(sinfai)*cosfai+c*cosfai^2; %fi
E(i)=sqrt(E(i));
end

这个不能算lsqnonlin函数出错吧?

 

前面一个是兼容性警告,告诉你在将来的版本中可能不再支持LevenbergMarquardt LargeScale这两个选项,并且,如果不想看到该警告信息,可以设置Algorithm 'levenberg-marquardt',也就是把原代码中的

options=optimset('LargeScale','off','LevenbergMarquardt','on','Display','iter', 'MaxFunEvals',20000,'MaxIter',1000);

改为

options=optimset('Algorithm', 'levenberg-marquardt','Display','iter', 'MaxFunEvals',20000,'MaxIter',1000);

第二个是告诉你算法终止的原因是,步长已小于给定值。由于优化是一个按照某些规则反复进行迭代的过程,到最后收敛时通常是一个渐进的过程,所以设定一个步长限制,一旦相邻两次迭代的步长很小,以至于可以认为没有区别了,那么算法就会终止。至于所求出来的是不是最优解,会取决于多种条件,例如问题本身、算法以及初值等因素。当然,你可以用optimset函数把TolX设置更小一些,但由于原因并不在此,一般不会有什么作用,还不如考虑试一试其它初值。

 

函数wucha中cmat并没有定义,你这段代码不能运行,所以,我也无法对优化的结果是否合理做进一步分析。

温馨提示:答案为网友推荐,仅供参考