-1

Assuming General formula of hyperbola to be y = 1 / (a*x + b), and we are provided with 100 data points out of which 99 points exactly fits a hyperbola and one data point is doesn't fits in it (unknown), from this information we need to find approximate values of a and b parameters for the hyperbola that will be formed from correct data points which are provided.

The approach which I took was by using scipy.optimize.curve_fit method as "parameters, _ = optimize.curve_fit(test, x_data ,y_data) " where my "test" function was "def test(x, a, b): return 1 / (a*x + b)" using this method provides me perfect solution is my data points are all in first quadrant but if the data is distributed in more than one quadrant then this approach fails and I get wrong values of a and b.

Code:

import numpy as np 
from scipy import optimize

x_data = np.linspace(-5,1, num=99)
y_data = 1 / (5 * x_data + 4) # value of original value of a = 5 & b = 4 
np.random.seed(0)

# adding wrong point at 36th position
x_data = np.insert(x_data, 36 , 7)
y_data = np.insert(y_data, 36, 5)  

def test(x, a, b):
    return 1 / (a*x + b)

parameters, _ = optimize.curve_fit(test, x_data ,y_data)
[a,b] = parameters

a = 146.83956808191303
b = 148.78257639384725
# which is too wrong

Solution for above will certainly be appreciated.

  • 1
    Please read this:https://stackoverflow.com/help/how-to-ask . Then, what did you tried? It is always easier to have a starting point in order to help you. – Netwave Mar 21 '19 at 05:43
  • If you can reduce the number of data points to only four of five and (hopefully) still reproduce the problem, please post those few data points with your code. This will make it easy for us to work with. – James Phillips Mar 21 '19 at 11:14
  • 1
    Alright I will do it. – Siddharth Shrivastava Mar 21 '19 at 11:37
  • The default initial parameter values for curve_fit are all 1.0, when I use your posted code with different starting parameters like this: "parameters, _ = optimize.curve_fit(test, x_data ,y_data, p0=[5.0, 4.0])" it works OK. – James Phillips Mar 21 '19 at 15:31

1 Answers1

0

Your problem is easy if the given points "exactly fit the hyperbola," and you need only two data points.

Your equation y = 1 / (ax + b) can be transformed into

(x*y) * a + (y) * b = 1

That is a linear equation in a and b. Use two data points to find the corresponding values of x * y and y and you end up with two linear equations in two variables (though in a and b rather than x and y). Then solve those two linear equations. This can easily be automated. This also does not depend on the quadrants of your two given points.

This does not work if your given points only approximate a hyperbola, of course.


In your last edit, you added the statement that only 99 of the points fit on the hyperbola, and one does not. This can be handled by choosing three pairs of your points (six distinct points), and finding the hyperbola that goes through each pair of points. That means calculating three hyperbolas (equivalently, calculating three values of a and b). If those three pairs of a and b all agree with small precision, the non-matching point was not in the chosen sample of three pairs of points and you have your hyperbola. If only two of them agree within precision, use that hyperbola. If no pair of the hyperbolas agree, some mistake was made and you should raise an exception.

Rory Daulton
  • 21,934
  • 6
  • 42
  • 50