MATLAB Answers

# Help fitting data to an implicit equation

66 views (last 30 days)
mura0087 on 13 Jan 2021
Commented: mura0087 on 19 Jan 2021
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!
##### 0 CommentsShowHide -1 older comments

Sign in to comment.

### Accepted Answer

Jeff Miller on 14 Jan 2021
Edited: Jeff Miller on 14 Jan 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 CommentsShowHide 2 older comments
mura0087 on 16 Jan 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!

Sign in to comment.

### More Answers (1)

John D'Errico on 16 Jan 2021
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.
##### 1 CommentShowHide None
mura0087 on 19 Jan 2021
This also works! Thank you!

Sign in to comment.

R2020b

### Community Treasure Hunt

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

Start Hunting!