# [ACCEPTED]-Interpolation in SciPy: Finding X that produces Y-scientific-computing

Score: 18

The UnivariateSpline class in scipy makes 5 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 4 x at y then do:

``````yToFind = 140
yreduced = np.array(y) - yToFind
freduced = interpolate.UnivariateSpline(x, yreduced, s=0)
freduced.roots()
``````

I thought interpolating x 3 in terms of y might work but it takes a 2 somewhat different route. It might be closer 1 with more points.

Score: 3

If all you need is linear interpolation, you 1 could use the interp function in numpy.

Score: 0

I may have misunderstood your question, if 4 so I'm sorry. I don't think you need to 3 use SciPy. NumPy has a least squares function.

``````#!/usr/bin/env python

from numpy.linalg.linalg import lstsq

def 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 x

if __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 2 will return [ 128.81280358 -143.16202286 1 61.96032544].

``````>>> x=1.47 # the first of the input data
>>> 128.81280358 + -143.16202286*x + 61.96032544*(x**2)
52.254697219095988
``````