我遇到了一个合适的问题。根据我得到的错误,我想象边界没有正确定义,我没有设法找到解决方案。非常感谢任何帮助。
也可以接受解决相同问题的替代方法。
我必须估计类型的非线性函数的参数:
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的非线性方程的目标函数)在数据上运行代码我得到了这个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;
答案 0 :(得分:0)
我没有优化工具箱,但您确定可以传递这样的常量吗?
我会这样做:
calcParam = lsqnonlin(@(PAR) objectiveFunction_lsq_2(PAR,Xmeas,Ymeas),initialGuess,LB,UB);