Fitting an Equation on to graph

20 views (last 30 days)
Hans123
Hans123 on 13 Mar 2019
Edited: John D'Errico on 15 Mar 2019
I have a graph with the approximate shape of 1/x type. I wish to fit it with the equation 1/(x-A) +B . How can I fit a particular equation onto it rather than using the basic fitting tools?
  1 Comment
Jim Riggs
Jim Riggs on 14 Mar 2019
I will look at home for some examples of least-squares curve fitting. If you don't find a satisfactory answer I will make a post tomorow.

Sign in to comment.

Accepted Answer

John D'Errico
John D'Errico on 14 Mar 2019
Edited: John D'Errico on 15 Mar 2019
Easiest is if you just use the curvefitting toolbox, OR the stats toolbox, OR the optimization toolbox.
Still easy enough to use fminsearch.
% practice data.
x = 0:100;
y = 1./(x + 17) + pi + randn(size(x))/500;
plot(x,y,'.')
Now fit it.
% objective function for fminsearch
obj = @(AB) norm(y - (1./(x + AB(1)) + AB(2)));
AB0 = [5,5];
[AB,fval] = fminsearch(obj,AB0)
AB =
16.907 3.1416
fval =
0.017046
Which seems reasonable.
hold on
plot(x,1./(x + AB(1)) + AB(2),'-r')
Will this fit solve your problem? I predict it will not do so,and your next question will be to ask how to make your equation fit your data better. At least, that is what usually happens on this sort of question. Why?
Because you have chosen a VERY specific model form,and we have not seen the data you have to know if that model form is a valid one for your data. You say only that your data has an approximate 1/x shape. Yeah, right. Not enough information. Why not?
That requires I talk some about the model you chose, and what it represents. The model
y = 1/(x+A) + B
can be re-written simply as
(x+A)*(y-B) = 1
What can we gain from that form, since it converts a simple functional form into an implicit form? The equation
x*y = 1
is the classic equation of a hyperbolic arc, one that has explicitly horizontal and vertical asymptotes. Thus, the latter form has y-->0 as x-->inf, and y-->inf as x--> 0 from above.
The form you have chosen is the same equation, except the asymptotes are translated. So we get a horizontal asymptote at y=B, where X must go to inf. That is, when y==b, the implicit equation reduces to
(x+A)*0 = 1
There is no finite x that solves it. Likewise, at x==-A, there is again a problem, since the problem reduces to
0*(Y-B) = 1
Again, no finite value of y produces a valid result here. That is, we have a singularity.
So the form you have chosen has a VERY specific behavior. But, even more than that, you still have a problem. You say only that your data looks sort of like y = 1/x. But what you don't understand I think is that there are MANY sets of data that would look like that, yet your model form will fail to fit it.
For example, suppose I gave you some simple data, with no noise at all in it.
x = 1:.2:25;
y = 2./x;
plot(x,y,'o')
I could have chosen as much data as you wish. But this will be easy to plot and look at. But, can you fit it with that model form? I mean, it looks like 1/x.
untitled.jpg
What will happen is the model you have chosen is inadequate. It will show lack of fit. There is nothing you can do to make the two forms fit up.
y = 1/(x+A) + B = 2/x
No choice of A and B will give the correct fit, since by changing A or B, we change only the location of the asymptotes!
obj = @(AB) norm(y - (1./(x + AB(1)) + AB(2)));
AB0 = [5,5];
[AB,fval] = fminsearch(obj,AB0)
AB =
-0.53389 0.10157
fval =
0.84217
hold on
plot(x,1./(x + AB(1)) + AB(2),'-r')
untitled.jpg
So there is significant lack of it. Your model is inadequate to fit that data, because changing the asymptote locations is not what was needed. Had I posed a model that looked like
y = C/(x + A) + B
NOW I could have fit a model that fit my data exactly. The result from the fit would have been
A = 0
B = 0
C = 2
(Do I really need to do that fit to prove my point? No, I hope not.)
My point is, even though your data looks vaguely like 1/x, that does not mean you have chosen even remotely the correct model. Without seeing your data, OR some valid reason to believe your claim that it looks like 1/x, all I can suggest is as I did before, that even though I've shown you how to fit your data to this model, in the end you will probably be disappointed. After all, 1/x LOOKS an awful lot like 2/x. Sigh.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!

Translated by