我正在使用lsqnonlin优化一些测试数据(即从已知参数值模拟的数据)。
maturity=[1 3 6 9 12 15 18 21 24 30 36 48 60 72 84 96 108 120]'; %maturities
options=optimset('Algorithm',{'levenberg-marquardt',.01},'Display','iter','TolFun',10^(-20),'TolX',10^-3,'MaxFunEvals',10000,'MaxIter',10000); %LM
vp0=[0.99 0.94 0.84 0.0802 -0.0144 -0.0042 0.001693 0.004094 0.003256 log(0.000960765^2) 0.077]'; %LM
[vpML,resnorm,residual,exitflag,output,lambda,jacobian]=lsqnonlin(@(vp) DNS_LL_LM(vp,y,maturity),vp0,[],[],options); %LM
我希望当参数向量的范数改变10 ^ -6时发生收敛。
由于'TolX'指的是参数向量中的原始变化,我使用10 ^ -3作为X的容差,当平方时,得到所需的10 ^ -6范数。
但是我发现当我运行代码时,exitflag会一直显示为exitflag = 4:“搜索方向的幅度小于指定的容差。”
但是没有地方可以设置搜索方向的容差吗?
在选项中,您只能设置:“TolX”和“TolFun”?
http://www.mathworks.co.uk/help/optim/ug/lsqnonlin.html#f265106
那么如何强制优化继续运行直到达到我想要的收敛标准?
亲切的问候
巴兹
答案 0 :(得分:1)
好的,我进入了代码,这里描述的exitflags似乎有一些脱节:
http://www.mathworks.co.uk/help/optim/ug/lsqnonlin.html#f265106
例如,上面的链接中的exitflag 2应该与x的变化小于容差有关,实际上这里用来表示雅可比未定义
if undefJac
EXITFLAG = 2;
msgFlag = 26;
msgData = {'levenbergMarquardt',msgFlag,verbosity > 0,detailedExitMsg,caller, ...
[], [], []};
done = true;
mathworks页面上的exitflag 4的描述有点模糊,但你可以看到它在下面做了什么:
if norm(step) < tolX*(sqrtEps + norm(XOUT))
EXITFLAG = 4;
msgData = {'levenbergMarquardt',EXITFLAG,verbosity > 0,detailedExitMsg,caller, ...
norm(step)/(sqrtEps+norm(XOUT)),optionFeedback.TolX,tolX};
done = true;
似乎它正在测试步长的范数是否小于X的范数X的公差。这是我想要的,并且可以很容易地改变以给我我想要的东西。