3

我在拟合问题上遇到困难。从我得到的错误中,我想边界没有正确定义,我还没有找到解决方案。任何帮助将不胜感激。

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

描述

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

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 的非线性方程的目标函数)

错误

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

警告:下限长度 > 长度(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;
4

1 回答 1

0

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

我会这样做:

calcParam = lsqnonlin(@(PAR) objectiveFunction_lsq_2(PAR,Xmeas,Ymeas),initialGuess,LB,UB);
于 2012-11-08T13:47:46.443 回答