Predicting lower and upper bounds of coefficients for curve fitting tool.

22 views (last 30 days)
Dear all,
I have a set of data, where X describes the time in hours and Y describes a concentration of a substance in g/l (see figure below, data is attached).
I am now looking for a curve that fits the data best. Since the data is skewed to the right I would prefer a curve that has a form of a gumbel function, slightly adjusted with a parameter s to stretch or compress the curve:
I know that I can use the curve fitting tool. However, it is kind of tedious to "play around" with the lower and upper bound for the coefficients a, b and s. So my question is if there is a way to predict the lower and upper bound for the coefficients? What possibillities do I have if I do not use the curve fitting tool at all?
I would really appreciate any help or hint!
Cheers
  4 Comments
Torsten
Torsten on 3 May 2019
What are the initial parameters you provide for the fitting tool ? How does the curve look like for your initial parameters ?
Jule
Jule on 6 May 2019
I don´t provide the initial parameters, Matlab is doing it on its own. So a = 0.9593, b = 0.5472 and s = 0.1386, resulting in f(x) = 0. This is exactly the point I am looking for, a way to predict suitable values for a, b and s, based on the data I have. Playing around with the lower and upper boundaries results in a good fit, but it is also time-consuming, which I like to avoid.
A good fit for the data provided is a = 0.05621, b = 253.6 and s = 95.74. However, the values do not make much sense to me. b describes the shift along the x axis, but what about a and s?

Sign in to comment.

Answers (1)

darova
darova on 3 May 2019
You can manually experiment with a,b,c
clc,clear
load X.mat
load Y.mat
func = @(a,b,c,x) a*exp( -(x-c).^2/b );
opt = fitoptions('Method','NonlinearLeastSquares',...
'Lower',[0 0 0],... % coefficient lower boundaries
'Upper',[10 100 300],... % coefficient upper boundaries
'StartPoint',[7 50 225]);
ft = fittype(func,'options',opt);
f = fit(x,y,ft)
plot(x,y,'.r')
hold on
a = f.a; % a = 7; height
b = f.b; % b = 65; width
c = f.c; % c = 255; x shift
x1 = linspace(min(x),max(x));
plot(x1,func(a,b,c,x1))
hold off
And what i got with (a=7, b=65, c=255)
img.png

Community Treasure Hunt

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

Start Hunting!