非线性函数参数估计 - matlab,lsqnonlin,fzero

时间:2012-10-10 16:11:32

标签: matlab least-squares nonlinear-functions

我遇到了一个合适的问题。根据我得到的错误,我想象边界没有正确定义,我没有设法找到解决方案。非常感谢任何帮助。

也可以接受解决相同问题的替代方法。

描述

我必须估计类型的非线性函数的参数:

A*y(x) + B*EXP(C*y(x)) + g(x,D) = 0

使参数PAR = [A,B,C,D]

范围内
LB < PAR < UB

代码

要解决这个问题,我正在使用Matlab函数lsqnonlinfzero。使用的简化代码报告如下。

问题分为四个功能:

  1. parameterEstimation - (lsqnonlin函数的包装器)
  2. objectiveFunction_lsq - (参数估计的目标函数)
  3. yFun - (函数使变量y的值保持不变)
  4. objectiveFunction_zero - (用于计算y的非线性方程的目标函数)
  5. 错误

    在数据上运行代码我得到了这个waring

      

    警告:下限长度>长度(X);忽略额外界限

    和此错误

      

    初始用户提供的目标函数评估失败。   LSQNONLIN无法继续

    这让我觉得边界没有正确使用或没有正确调用,但问题可能在其他地方。


    function Done = parameterEstimation()
        %read inputs
        Xmeas = xlsread('filepath','worksheet','range');
        Ymeas = xlsread('filepath','worksheet','range');
    
        %inital values and boundary conditions
        initialGuess = [1,1,1,1]; %model parameters initial guess
        LB = [0,0,0,0]; %model parameters lower boundaries
        UB = [2,2,2,2]; %model parameters upper boundaries
    
        %parameter estimation
        calcParam = lsqnonlin(@objectiveFunction_lsq_2,initialGuess,LB,UB,[],Xmeas,Ymeas);
        Done = calcParam;
    
    function diff = objectiveFunction_lsq_2(PAR,Xmeas,Ymeas)
        y_calculated = yFun(PAR,Xmeas);
        diff = y_calculated-Ymeas;
    
    function result = yFun(PAR,X)
        y_0 = 2;
        val = fzero(@(y)objfun_y(y,PAR,X),y_0);
        result = val;
    
    function result = objfun_y(y,PAR,X)
        A = PAR(1);
        B = PAR(2);
        A = PAR(3);
        C = PAR(4);
        D = PAR(5);
    
        val = A*y+B*exp(y*C)+g(D,X);
        result = val;
    

1 个答案:

答案 0 :(得分:0)

我没有优化工具箱,但您确定可以传递这样的常量吗?

我会这样做:

calcParam = lsqnonlin(@(PAR) objectiveFunction_lsq_2(PAR,Xmeas,Ymeas),initialGuess,LB,UB);