我在拟合问题上遇到困难。从我得到的错误中,我想边界没有正确定义,我还没有找到解决方案。任何帮助将不胜感激。
解决相同问题的替代方法也被接受。
描述
我必须估计以下类型的非线性函数的参数:
A*y(x) + B*EXP(C*y(x)) + g(x,D) = 0
受参数PAR = [A,B,C,D]
在范围内
LB < PAR < UB
代码
为了解决这个问题,我使用了 Matlab 函数lsqnonlin
和fzero
. 使用的简化代码报告如下。
问题分为四个功能:
parameterEstimation
- (lsqnonlin 函数的包装器)objectiveFunction_lsq
- (参数估计的目标函数)yFun
- (返回变量 y 值的函数)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;