Clear Filters
Clear Filters

Numerical fitting to model that has Integral with no analytical solution

3 views (last 30 days)
I'm attempting to fit a model to my numerical dataset. Unfortunately, the model contains an integral that cannot be solved analytically, but it can be solved numerically using integral function. The response is g_a and the input is T. However, I am getting the following error.
Error using nlinfit (line 205) Error evaluating model function '@(b,y)b(1)./Beta*integral(@(y)f(y,b),1273,T)'.
Error in NonLinearModel/fitter (line 1122) [model.Coefs,~,J_r,model.CoefficientCovariance,model.MSE,model.ErrorModelInfo,~] = ...
Error in classreg.regr.FitObject/doFit (line 220) model = fitter(model);
Error in NonLinearModel.fit (line 1430) model = doFit(model);
Error in fitnlm (line 94) model = NonLinearModel.fit(X,varargin{:});
Error in test (line 12) mdl=fitnlm(g_a,T,modelfun,beta0);
Caused by: Error using integral (line 85) A and B must be floating-point scalars.
A=76540300000;
E=440.156;
Beta=1;
R=8.314e-3;
f=@(y,b) exp(-b(2)./(R*y));
modelfun = @(b,y) b(1)./Beta*integral(@(y)f(y,b),1273,T);
beta0=[76540300000 440];
mdl=fitnlm(g_a,T,modelfun,beta0);

Answers (1)

Neil Guertin
Neil Guertin on 10 Aug 2017
There are many things here that could be causing issues:
The error you see is because the third argument to the integral function (xmax) must be a scalar. You have given T, which I assume is a matrix.
Also, you have flipped the first two arguments of fitnlm. The first should be the input matrix T, the second should be the response vector g_a.
modelfun must be a vectorized function, meaning that its parameter y is a matrix where each row corresponds to an observation, and it returns a column vector where each row is the response from that observation. You may find it easier to use a local or a nested function instead of an anonymous function.
Finally, the parameter y of modelfun is shadowed by the parameter y of the integral function. This would be another reason to use a local or a nested function, or you could simply rename one of the parameters.
  1 Comment
laurent jalabert
laurent jalabert on 17 Feb 2023
is there any update regarding the solution of this problem ?
I have a similar problem, even more complicated using a vector, constant parameter, and an integral function as a fitting model. It is a pure hurdle,but it is easily solved in Mathematica. However, I did not succeeded to translate from Mathematica to Matlab. I do not understand how to do that.

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!