curve fitting a custom equation

a*exp(-x/T) +c*(T*(exp(-x/T)-1)+x)
This is the equation i'm trying to fit using the custom fit tool. Since the variable x is both in exponential and linear form, the data isn't really fitting, it's just a straight line. Is there way to fit the data to this equation?
As a side note: how do I view the numerical values instead of scientific ones in curve fitting tool?
Thank you

1 comentario

Matt J
Matt J el 16 de Jul. de 2021
Editada: Matt J el 16 de Jul. de 2021
In the first line of your post, you show the model equation as,
a*exp(-x/T) +c*(T*(exp(-x/T)-1)+x)
However, in your screenshot of the cftool app, the model equation appears instead as,
a*exp(-x*T) +c*(T*(exp(-x/T)-1)+x)
You should edit your post so that we know which version of the equation is the intended one.

Iniciar sesión para comentar.

 Respuesta aceptada

Alex Sha
Alex Sha el 17 de Jul. de 2021
Editada: Alex Sha el 18 de Jul. de 2021
Hi, all, as mentioned by Walter Roberson, the resule I provided above is obtained by using 1stOpt, the biggest advantage, for 1stOpt, is that the guessing of initial-start values are no longer needed for curve-fitting, equation-solving or any other optimization problem.
if the model function is: y=a*exp(-x*T) +c*(T*(exp(-x/T)-1)+x), the result is:
Root of Mean Square Error (RMSE): 15155741.0636478
Sum of Squared Residual: 4.59392974376683E15
Correlation Coef. (R): 0.996754359090101
R-Square: 0.993519252365118
Parameter Best Estimate
---------- -------------
a -33754000.9741343
t -1.00000000434611
c -33754006.8543357
Note the value of parameter t: t=-1.00000000434611, if taking t as -1.00, the chart will become:
The Sensitivity analysis of each parameter is as below:
while, if the model function is: y=a*exp(-x/T) +c*(T*(exp(-x/T)-1)+x), the result is:
Root of Mean Square Error (RMSE): 15137803.4043043
Sum of Squared Residual: 4.58306183814736E15
Correlation Coef. (R): 0.996383637725283
R-Square: 0.992780353526669
Parameter Best Estimate
---------- -------------
a -54592643.2783804
t -1.72718663083536
c -31608221.5261319

2 comentarios

Alex Sha
Alex Sha el 17 de Jul. de 2021
The result got by Matt J (as show below) is actually a local solution, not global one.
a =
-6.2820e+07
c =
-2.9980e+07
T =
1.0481e-14
Matt J
Matt J el 17 de Jul. de 2021
Editada: Matt J el 17 de Jul. de 2021
The solution I presented below constrained the search to T>=0, so it might be global subject to that constraint.
It's important to notice as well that whether T=-1 or T=0 is taken as the solution, it results in a cancelation of the exponential terms, leaving an essentially linear solution. It makes it seem like either the model was over-parametrized to begin with, or there isn't enough (x,y) data to accurately estimate the exponential terms.

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 15 de Jul. de 2021

1 voto

You don't need a custom type. Your model is just exp2 but with modified data (x,y-x)

11 comentarios

Ayushi Sharma
Ayushi Sharma el 15 de Jul. de 2021
Ah yes I see it, but I need the value of co-efficient 'c' primarily, that's the whole reason behind curve fitting. Could you elucidate how to do that?
Ayushi Sharma
Ayushi Sharma el 15 de Jul. de 2021
@Matt J besides there's also a constant term that'll need to be accounted for. How should I do it? Many thanks
Matt J
Matt J el 15 de Jul. de 2021
Editada: Matt J el 15 de Jul. de 2021
OK. So first, I would reparametrize your model more simply as follows,
A*exp(-x/T)+c*(x-1)
Then I would use fminspleas from the File Exchange to solve this. Because only T affects the model non-linearly, it should do a good job with this model assuming you have a decent initial guess T0 for T.
funlist={ @(T,x)exp(-x/T) , @(T,x) (1-x) }
[T,Ac]=fminspleas(funlist, T0, x,y, 0);
c=Ac(2);
a=Ac(1)-c*T;
If you still need a Curve Fitting Toolbox result, you can at least use the results of fminspleas to provide the cftool app an initial parameter guess. That should help it reach a more accurate fit with your custom equation.
Alex Sha
Alex Sha el 16 de Jul. de 2021
Hi, Sharma, the result you got is actual a local solution, not global one. The result below is the correct one
Root of Mean Square Error (RMSE): 15137803.4043152
Sum of Squared Residual: 4.58306183815394E15
Correlation Coef. (R): 0.996383637520966
R-Square: 0.992780353119513
Parameter Best Estimate
---------- -------------
t -1.72718650949557
a -54592639.7090172
c -31608221.6797308
Ayushi Sharma
Ayushi Sharma el 16 de Jul. de 2021
@Alex Sha can you please share how you got this result? It'll be a great help!
In the file shared:
y = dv
and x = t
Matt J
Matt J el 16 de Jul. de 2021
Editada: Matt J el 16 de Jul. de 2021
I don't see any column headers dv and t. It would be easier if you simply attach x,y directly in a .mat file
Ayushi Sharma
Ayushi Sharma el 16 de Jul. de 2021
I apologise I attached the wrong csv, I have corrected it.
I have attached the mat file as well (I'm not sure if the csv data got saved in the mat file though)
Matt J
Matt J el 16 de Jul. de 2021
Editada: Matt J el 16 de Jul. de 2021
First, you have mistyped your model function in your original post.
Second, the segment of data in doubt.mat is too linear to capture the exponential trends in the function. There are basically two solutions for T, which are T=0 and T=-1 both of which allow the solution ot degenerate to a linear fit. Here is what I get when initializing at T=1;
funlist={@(T,x)exp(-x*T), @(T,x) T*(exp(-x/T)-1)+x };
[T,ac]=fminspleas(funlist,1, x,y,0);
a=ac(1); c=ac(2);
fun=@(x) a*exp(-x*T) +c*(T*(exp(-x/T)-1)+x);
plot(x,y,'o', x,fun(x));
a,c,T
a =
-6.2820e+07
c =
-2.9980e+07
T =
1.0481e-14
Ayushi Sharma
Ayushi Sharma el 16 de Jul. de 2021
Thank you so much for your input. I have opted for this method.
Meanwhile @Alex Sha if you could please share the code for the results you shared, I shall be grateful. Thank you
Walter Roberson
Walter Roberson el 16 de Jul. de 2021
Alex uses a commercial program named 1stOpt from 7d-soft. It costs roughly $2000 for a license. That is, of course, not exactly "cheap"; however, having seen the results Alex has posted on a number of different problems, I would say that if you do curve fitting, that it does a very nice job. I can sometimes improve slightly over the results it gets, but only after at least an hour of work.
Matt J
Matt J el 16 de Jul. de 2021
Editada: Matt J el 16 de Jul. de 2021
Thank you so much for your input. I have opted for this method.
@Ayushi Sharma You're welcome, but please Accept-click the answer if you consider the question addressed.
Alex uses a commercial program named 1stOpt from 7d-soft. ... I would say that if you do curve fitting, that it does a very nice job.
However, the fit Alex has shown us is based on an incorrect model equation, because @Ayushi Sharma had a typo in the first line of his post. If we substitute Alex's parameter estimates into the true model, it gives strong disagreement with the data:
load doubt
a=-54592639.7090172;
c=-31608221.6797308;
T=-1.72718650949557;
fun=@(x) a*exp(-x*T) +c*(T*(exp(-x/T)-1)+x);
plot(x,y,'o'); ax=axis;
hold on
plot( x,fun(x));
hold off
axis(ax)
legend('Data','Fit')

Iniciar sesión para comentar.

Categorías

Más información sobre Get Started with Curve Fitting Toolbox en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 15 de Jul. de 2021

Editada:

el 18 de Jul. de 2021

Community Treasure Hunt

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

Start Hunting!

Translated by