سؤال

هل هناك طريقة أفضل للعثور على أي <م> X يعطيني <م> Y أنا أبحث عن في SciPy؟ أنا فقط بدأت باستخدام SciPy وأنا لم تكن مألوفة جدا مع كل وظيفة.

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
هل كانت مفيدة؟

المحلول

والطبقة UnivariateSpline في scipy يجعل القيام المفاتيح أكثر 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))

لتجد x في ذ ثم القيام به:

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

واعتقدت التحريف العاشر من حيث ذ قد عمل لكنه يأخذ طريقا مختلفا إلى حد ما. قد يكون أوثق مع المزيد من النقاط.

نصائح أخرى

وإذا كان كل ما تحتاجه هو الخطية، هل يمكن استخدام في وظيفة التفسيرى في نمباي.

وربما أكون قد يساء فهمها سؤالك، إذا كان الأمر كذلك أنا آسف. أنا لا أعتقد أنك في حاجة إلى استخدام SciPy. نمباي لديها أقل وظيفة الساحات.

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

وهذا سيعود [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 خارج، ليست سيئة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top