Matlab lsqnonlin()exitflag = 4

时间:2014-07-01 16:02:52

标签: matlab mathematical-optimization

我正在使用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

那么如何强制优化继续运行直到达到我想要的收敛标准?

亲切的问候

巴兹

1 个答案:

答案 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的公差。这是我想要的,并且可以很容易地改变以给我我想要的东西。