Curve fitting with integral involved

3 views (last 30 days)
lvenG
lvenG on 19 Sep 2021
Edited: lvenG on 20 Sep 2021
Hello. I am having trouble generating an equation to estimate parameters given a set of data for B and T. I am about to use lsqcurve fitting but for some reason i could not make the code run.
The equation should be in the form of :
See below:
T = [120,210,400,540,650];
B = [-344,-157,-17.5,-0.85,10.5];
fun = @(constant,T)(int(((2.*pi.*(constant(1)).^3)./3).*(1-exp((-4.*constant(2)./T)*((1./y.^4)-(1./y.^2)))),y,0,10));
T0 = [110,200]; %I just entered a random number, but don't know what this is for
T = lsqcurvefit(fun,T0,T,B);
The error I am getting is:
Unrecognized function or variable 'y'.
Error in
samplesept19>@(constant,T)(int(((2.*pi.*(constant(1)).^3)./3).*(1-exp((-4.*constant(2)./T)*((1./y.^4)-(1./y.^2)))),y,0,10))
(line 9)
fun =
@(constant,T)(int(((2.*pi.*(constant(1)).^3)./3).*(1-exp((-4.*constant(2)./T)*((1./y.^4)-(1./y.^2)))),y,0,10));
Error in lsqcurvefit (line 225)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});
Error in samplesept19 (line 12)
T = lsqcurvefit(fun,T0,T,B);
Caused by:
Failure in initial objective function evaluation. LSQCURVEFIT cannot continue.
Hoping for answers and help. :) Thank you so much!

Accepted Answer

Walter Roberson
Walter Roberson on 19 Sep 2021
format long g
T = [120,210,400,540,650];
B = [-344,-157,-17.5,-0.85,10.5];
syms t y
syms constant [1 2]
expr = ((2.*pi.*(constant(1)).^3)./3).*(1-exp((-4.*constant(2)./t)*((1./y.^4)-(1./y.^2))))
expr = 
intexpr = int(expr, y, 0, 10)
intexpr = 
RHS = 2/3.*pi.*(constant(1)).^3 .* intexpr;
fun = matlabFunction(RHS, 'vars', {constant, t})
fun = function_handle with value:
@(in1,t)in1(:,1).^3.*pi.*integral(@(y)in1(:,1).^3.*pi.*(exp((in1(:,2).*(1.0./y.^2-1.0./y.^4).*4.0)./t)-1.0).*(-2.0./3.0),0.0,1.0e+1).*(2.0./3.0)
obj = @(P,T) arrayfun(@(t) fun(P,t), T)
obj = function_handle with value:
@(P,T)arrayfun(@(t)fun(P,t),T)
P0 = [110,200]; %I just entered a random number, but don't know what this is for
P = lsqcurvefit(obj, P0, T(:), B(:))
Local minimum possible. lsqcurvefit stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance.
P = 1×2
1.6038792022093 184.707909161448
B2_predicted = obj(P,T(:));
plot(T, B, 'k*', T, B2_predicted, 'b-+')
legend({'original B', 'predicted B'}, 'location', 'best')
  3 Comments
Walter Roberson
Walter Roberson on 20 Sep 2021
P(1) is constant(1) and P(2) is constant(2)
lvenG
lvenG on 20 Sep 2021
@Walter Roberson, thank you so much Sir. This worked.... Really, thanks for the help and enlightenment... Hope you are having a great day! Stay safe.

Sign in to comment.

More Answers (0)

Categories

Find more on Spline Postprocessing in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!