Matlab lsqnonlin()exitflag=4

Matlab lsqnonlin()exitflag=4,matlab,mathematical-optimization,Matlab,Mathematical Optimization,我正在使用lsqnonlin优化一些测试数据(即根据已知参数值模拟的数据) 我希望在参数向量的范数改变10^-6时发生收敛 由于“TolX”指的是参数向量中的原始变化,我使用10^-3作为X的公差,当平方时,将给出所需的10^-6范数 然而,我发现,当我运行代码时,exitflag一直显示为exitflag=4:“搜索方向的大小小于指定的公差” 但是没有地方为搜索方向设定公差 在选项中,您只能设置:“通行费”和“通行费” 那么,我如何强制优化继续运行,直到达到我想要的收敛标准呢 问候 Baz好

我正在使用lsqnonlin优化一些测试数据(即根据已知参数值模拟的数据)

我希望在参数向量的范数改变10^-6时发生收敛

由于“TolX”指的是参数向量中的原始变化,我使用10^-3作为X的公差,当平方时,将给出所需的10^-6范数

然而,我发现,当我运行代码时,exitflag一直显示为exitflag=4:“搜索方向的大小小于指定的公差

但是没有地方为搜索方向设定公差

在选项中,您只能设置:“通行费”和“通行费”

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

问候


Baz

好的,我进入了代码,这里描述的exitflags之间似乎存在一些断开:

例如,在上面的链接中,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;
if norm(step)0,detailedExitMsg,调用者。。。
norm(step)/(sqrtEps+norm(XOUT)),optionFeedback.TolX,TolX};
完成=正确;
似乎是在测试步长的标准值是否小于X乘以X的标准值的公差。这符合我的要求,并且可以很容易地进行更改,以完全满足我的要求

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;