使用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并没有定义,你这段代码不能运行,所以,我也无法对优化的结果是否合理做进一步分析。
matlab中lsqnonlin函数出错
这个不能算lsqnonlin函数出错吧?前面一个是兼容性警告,告诉你在将来的版本中可能不再支持LevenbergMarquardt 和LargeScale这两个选项,并且,如果不想看到该警告信息,可以设置Algorithm 为 'levenberg-marquardt',也就是把原代码中的 options=optimset('LargeScale','off','LevenbergMarquardt','on','Dis...
matlab中关于Lsqnonlin函数的问题,总是出现错误
lsqcurvefit函数Function value and YDATA sizes are incommensurate.就是说这个函数的数值是不相称的,应该是你没弄清楚这个函数的用法格式!
matlab中lsqnonlin函数的用法,出现了问题,自己不能解决,求高手赐教...
你的fun.m是不是没有放到当前目录下?另外一般我都是把x,y 直接定义到fun里面:function E = fun(a);global x y;x = x(:);y = y(:);...这样的话,在外面运行的时候,你定义 global x y;x = ...y = ...a0 = ...options = ...a = lsqnon(@fun, ......
用matlab中lsqnonlin函数拟合的曲线为什么差距这么大,跪求大神指点...
为什么用matlab中lsqnonlin函数拟合的曲线的差距有这么大?可能的原因是:1、拟合数学模型不合理 2、从散点图中可以看到,由于有极小点存在,造成拟合迭代初值没有靠近拟合曲线
MATLAB中的lsqnonlin函数的问题??
你a0没定义啊 ,而且函数和lsqnonlin不能放在一个文件里啊。你输在哪里了我怎么没看到啊?我建议你还是自己看看lsqnonlin的帮助文件里的例子。把用法和意思完全搞明白了再说。你这里完全乱的一塌糊涂。
最小二乘法求解二元方程组,matlab的lsqnonlin函数用法?
采用最小二乘法求解二元方程组时,首先利用matlab的lsqnonlin函数进行尝试,得到的方程组解为特定值。深入理解,lsqnonlin函数适用于非线性数据拟合问题,而非直接求解特定方程组。方程组v=0和s=S_all需转换为优化问题,目标是找到参数t1和t2,使得函数fun最小,理论上为零最佳。为了求解优化问题,使用粒子...
...有一非线性最小二乘问题中一函数lsqnonlin,我想把里边X的数据改为矩...
lsqnonlin函数采用的是迭代法,a0则是迭代初始值。由于程序的局限性,不可能搜索无穷大的区间,这样一来,初始值的选择就很重要了。如果最优解离所给初始值比较近,迭代求出该最优解的概率就很高;如果初始值提供的不理想,离最优解较远,而matlab对于迭代次数及迭代精度都有个默认的设定,这种情况下很...
matlab的lsqnonlin函数怎么用
P1等:传递给F的参数(有需要的话)以上就是isqnonlin的调用方法,最后再提醒大家,并不需要把所有的输入输出都写出来,只需要写出自己需要的就行。举个例子(比如只想要x):函数 function h=aabb(x)h(1)=x(2)-x(1)^2;h(2)=1-x(1);命令行 x0=[2,2];[x]=lsqnonlin(@aabb,x0)结果为...
matlab的lsqnonlin函数怎么用
函数使用方法如下:x=lsqnonlin(fun,x0)x=lsqnonlin(fun,x0,lb,ub)x=lsqnonlin(fun,x0,lb,ub,options)[x,resnorm]=lsqnonlin(...)[x,resnorm,residual]=lsqnonlin(...)[x,resnorm,residual,exitflag]=lsqnonlin(...)[x,resnorm,residual,exitflag,...
matlab的lsqnonlin函数怎么用
matlab的lsqnonlin函数主要用于解决非线性最小二乘问题。例如 >> F =@(x)[ 2*x(1) - exp(x(1)); -x(1) - exp(x(2));x(1) - x(2)];>> x = lsqnonlin(F,[1;1])运行结果