Interpolation in SciPy: Finding X that produces Y
The UnivariateSpline class in scipy makes doing splines much more pythonic.
x = [70, 80, 90, 100, 110]y = [49.7, 80.6, 122.5, 153.8, 163.0]f = interpolate.UnivariateSpline(x, y, s=0)xnew = np.arange(70,111,1)plt.plot(x,y,'x',xnew,f(xnew))
To find x at y then do:
yToFind = 140yreduced = np.array(y) - yToFindfreduced = interpolate.UnivariateSpline(x, yreduced, s=0)freduced.roots()
I thought interpolating x in terms of y might work but it takes a somewhat different route. It might be closer with more points.
I may have misunderstood your question, if so I'm sorry. I don't think you need to use SciPy. NumPy has a least squares function.
#!/usr/bin/env pythonfrom numpy.linalg.linalg import lstsqdef find_coefficients(data, exponents): X = tuple((tuple((pow(x,p) for p in exponents)) for (x,y) in data)) y = tuple(((y) for (x,y) in data)) x, resids, rank, s = lstsq(X,y) return xif __name__ == "__main__": data = tuple(( (1.47, 52.21), (1.50, 53.12), (1.52, 54.48), (1.55, 55.84), (1.57, 57.20), (1.60, 58.57), (1.63, 59.93), (1.65, 61.29), (1.68, 63.11), (1.70, 64.47), (1.73, 66.28), (1.75, 68.10), (1.78, 69.92), (1.80, 72.19), (1.83, 74.46) )) print find_coefficients(data, range(3))
This will return [ 128.81280358 -143.16202286 61.96032544].
>>> x=1.47 # the first of the input data>>> 128.81280358 + -143.16202286*x + 61.96032544*(x**2)52.254697219095988
0.04 out, not bad