Lsqnonlin错误的f(x)值

时间:2018-10-02 13:50:51

标签: matlab optimization

我需要解决反问题,然后使用lsqnonlin优化参数。在某些情况下,lsqnonlin无法正常工作。为了演示该问题,我有两种简单的代码变体。第一个效果很好,第二个根本不起作用。

  1. 在第一个变体中,我优化了x ^ 2。

    options = optimoptions('lsqnonlin','Display','iter');
    param_opt = lsqnonlin(@(param)loss_func(param),0.1,-1,1,options);
    
    function loss = loss_func(param)
       loss = param.^2;
    end
    

    我得到这个结果:

                                            Norm of      First-order 
    Iteration  Func-count     f(x)          step          optimality
        0          2          0.0001                        0.0022
        1          4     7.40992e-06      0.0456004       0.000299      
        2          6     5.09591e-07      0.0248167       3.92e-05      
        3          8     3.35176e-08      0.0130147       5.02e-06  
    

    param_opt = 0.0135;

  2. 在第二个变体中,我向损失函数添加了一个小错误(就像我在实际实验中一样),而lsqnonlin无法正常工作。

    options = optimoptions('lsqnonlin','Display','iter');
    param_opt = lsqnonlin(@(param)loss_func(param),0.1,-1,1,options);
    function loss = loss_func(param)
       loss = param.^2+(1e-6)*rand;
    end
    

    我得到这个结果:

                                            Norm of      First-order 
    Iteration  Func-count     f(x)          step          optimality
        0          2     0.000100005                        0.0315
        1          4     0.000100005     0.00299768         0.0315      
        2          6     0.000100005     0.00074942         0.0315      
        3          8     0.000100005    0.000187355         0.0315      
        4         10     0.000100005    4.68387e-05         0.0315      
        5         12     0.000100005    1.17097e-05         0.0315      
        6         14     0.000100005    2.92742e-06         0.0315      
        7         16     0.000100005    7.31855e-07         0.0315   
    

    param_opt = 0.1000;

我在做什么错?我在实际实验中遇到的问题是lsqnonlin的f(x)与实际的loss_func输出不匹配。

1 个答案:

答案 0 :(得分:0)

lsqnonlin的输入应为向量loss = param,该算法将进行平方和。无论如何,我认为您最好使用fmincon:

options = optimoptions('fmincon','Display','iter');
x = fmincon(@loss_func,0.1,[],[],[],[],-1,1,[],options);
function loss = loss_func(param)
   loss = param.^2;
end