Help fitting data to an implicit equation

Hello:
I need to fit some data to the following implicit equation:
((1-y)^(1-b)/y)=exp(-kt)
t is a vector containing time values and y is a vector containing current values. for each series of data y vs t, I need to determine b and k
b has to be between 0 and 1, and k needs to be greater than 0.
I have both the optimization and the curve fitting toolboxes.
Any suggestions on what tools to use (lsqcurvefit? something else? would be very appreciated)
Thanks!

 Respuesta aceptada

Jeff Miller
Jeff Miller el 14 de En. de 2021
Editada: Jeff Miller el 14 de En. de 2021
I would suggest using fminsearch. The error function to be minimized would be something like:
function thiserr = err(x,y,t)
b = x(1);
k = x(2);
thiserr = sum( (((1-y).^(1-b)./y) - exp(-kt))^2 );
end
You should be able to find examples of how to use fminsearch if you need more detail on how to call it. In your case y and t are "extra parameters". Look here for information on how to handle that.

3 comentarios

mura0087
mura0087 el 15 de En. de 2021
Editada: mura0087 el 15 de En. de 2021
Thank you!
Here is the error function I am using:
function thiserr = err(x,y,t)
b = x(1);
k = x(2);
thiserr = sum( (((1-y).^(1-b)./y) - exp(-k*t)).^2 );
end
And here is how I am calling the function:
fun = @(x)err(x,yvalues,tvalues); %define the function
x0=rand(2,1);%provide a random starting point for your parameters.
options = optimset('MaxFunEvals',1e1000000000000);
bestx=fminsearch(fun,x0);
I set options "MaxFunEvals" to a very high number because I keep getting the following error:
Exiting: Maximum number of function evaluations has been exceeded
- increase MaxFunEvals option.
Current function value: NaN
UPDATED- I believe the I am getting MaxFunEvals because the function does not fit my data. Fminsearch is doing its job just fine, this is a bad model. Thanks for your help
Jeff Miller
Jeff Miller el 16 de En. de 2021
You are welcome. That function value NaN is a bad sign. It means thiserr is NaN for all values of b and k that fminsearch has checked. You don't have any y=0 values, do you? Dividing by 0 would cause nans for all b and k.
mura0087
mura0087 el 16 de En. de 2021
No y=0 values. I even scaled the y values so that everything was nonzero and less than 1, and it still did not fit. I think I need a new function!
I did get this fminsearch method to a fit a different function to different data (that I generated, so I knew the function to fit it to) as a sanity check. I had not fit using the optimization toolbox before, but I now see this is a pretty elegant method for fitting, thanks again for suggesting it!

Iniciar sesión para comentar.

Más respuestas (1)

John D'Errico
John D'Errico el 16 de En. de 2021

0 votos

My thought would be the lazy solution. If your model is:
((1-y)^(1-b)/y)=exp(-kt)
then log the model. That is, we know that
(1-b)*log(1-y) + k*t = log(y)
With one more step, this reduces to
-b*log(1-y) + k*t = log(y) - log(1-y)
You can compute the parameters k and b using a simple linear regression now. Thus, if y and t are column vectors, we have:
bk = [-log(1-y),t] \ (log(y) - log(1-y));
so bk is a vector of length 2, contining the estimates for b and k respectively. If you find that b or k are estimated to be something outside of the valid region, then I would first consider if this is a reasonable model, but then you could just use lsqlin to estimate them, since lsqlin does provide bound constraints.

Productos

Versión

R2020b

Preguntada:

el 13 de En. de 2021

Comentada:

el 19 de En. de 2021

Community Treasure Hunt

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

Start Hunting!

Translated by