Frage

Gibt es einen besseren Weg zu finden, die X gibt mir die Y Ich suche in SciPy? Ich begann gerade SciPy mit und ich bin nicht allzu vertraut mit jeder Funktion.

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

x = [70, 80, 90, 100, 110]
y = [49.7, 80.6, 122.5, 153.8, 163.0]
tck = interpolate.splrep(x,y,s=0)
xnew = np.arange(70,111,1)
ynew = interpolate.splev(xnew,tck,der=0)
plt.plot(x,y,'x',xnew,ynew)
plt.show()
t,c,k=tck
yToFind = 140
print interpolate.sproot((t,c-yToFind,k)) #Lowers the spline at the abscissa
War es hilfreich?

Lösung

Die UnivariateSpline Klasse in scipy macht Splines viel mehr pythonic tun.

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))

Um x zu y findet dann tun:

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

dachte ich x in Bezug auf die y interpoliert funktionieren könnte, aber es dauert eine etwas andere Route. Es könnte mit mehr Punkten näher sein.

Andere Tipps

Wenn alles was Sie brauchen eine lineare Interpolation ist, können Sie die interp Funktion in numpy.

Vielleicht habe ich Ihre Frage falsch verstanden, wenn ja, tut es mir leid. Ich glaube nicht, Sie brauchen SciPy zu verwenden. NumPy hat eine der kleinsten Quadrate Funktion.

#!/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))

Dies wird 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 aus, nicht schlecht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top