Frage

Ich habe Daten zu X- und Y -Achsen und die Ausgabe ist auf z ist

zum Beispiel

y = 10
x = [1,2,3,4,5,6]
z = [2.3,3.4,5.6,7.8,9.6,11.2]

y = 20 
x = [1,2,3,4,5,6]
z = [4.3,5.4,7.6,9.8,11.6,13.2]

y = 30 
x = [1,2,3,4,5,6]
z = [6.3,7.4,8.6,10.8,13.6,15.2]

Wie kann ich den Wert von z finden, wenn y = 15 x = 3,5

Ich habe versucht, Scipy zu verwenden, aber ich bin sehr neu darin

Vielen Dank für die Hilfe

Vibhor

War es hilfreich?

Lösung

scipy.interpolat.bisplrep

Bezug:http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolat.bisplrep.html

import scipy
import math
import numpy
from scipy import interpolate


x= [1,2,3,4,5,6]
y= [10,20,30]

Y = numpy.array([[i]*len(x) for i in y])
X = numpy.array([x for i in y])
Z = numpy.array([[2.3,3.4,5.6,7.8,9.6,11.2],
                 [4.3,5.4,7.6,9.8,11.6,13.2],
                 [6.3,7.4,8.6,10.8,13.6,15.2]]) 

tck = interpolate.bisplrep(X,Y,Z)
print interpolate.bisplev(3.5,15,tck) 


7.84921875

BEARBEITEN:

Die obere Lösung bietet Ihnen keine perfekte Passform. überprüfen

print interpolate.bisplev(x,y,tck)

[[  2.2531746    4.2531746    6.39603175]
 [  3.54126984   5.54126984   7.11269841]
 [  5.5031746    7.5031746    8.78888889]
 [  7.71111111   9.71111111  10.9968254 ]
 [  9.73730159  11.73730159  13.30873016]
 [ 11.15396825  13.15396825  15.2968254 ]]

Um diese Interpolatis -Whit -Polyinome von 5rd Grad in X- und 2. Grad in Y -Richtung zu überwinden

tck = interpolate.bisplrep(X,Y,Z,kx=5,ky=2)
print interpolate.bisplev(x,y,tck) 

[[  2.3   4.3   6.3]
 [  3.4   5.4   7.4]
 [  5.6   7.6   8.6]
 [  7.8   9.8  10.8]
 [  9.6  11.6  13.6]
 [ 11.2  13.2  15.2]]

Diese Rendite

print interpolate.bisplev(3.5,15,tck)

7.88671875

Planung:
Hinweis http://matplotlib.sourceforge.net/examples/mplot3d/surface3d_demo.html

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z,rstride=1, cstride=1, cmap=cm.jet)
plt.show()

Andere Tipps

Gegeben (nicht als Python-Code, da die zweite Aufgabe in jedem Fall natürlich den ersten auslöscht ;-):

y = 10
x = [1,2,3,4,5,6]
z = [2.3,3.4,5.6,7.8,9.6,11.2]

y = 20 
x = [1,2,3,4,5,6]
z = [4.3,5.4,7.6,9.8,11.6,13.2]

Sie fragen: "Wie finde ich den Wert von z, wenn y = 15 x = 3,5"?

Da Sie einen Punkt in X und Y aus dem angegebenen "Gitter" ansehen, nehmen Sie einfach den Mittelpunkt zwischen den Gitterwerten (wenn Sie Werte nicht gleichbleibig hätten, würden Sie einen proportionalen Mittelpunkt nehmen, siehe später) . Für y = 10 betragen die Z -Werte für x 3 und 4 5,6 und 7,8, also schätzen Sie für x 3,5 ihren Mittelpunkt 6,7; und ähnlich für y = 20 schätzen Sie den Mittelpunkt zwischen 7,6 und 9,8, dh 8,7. Da Sie y = 15 haben, ist der Mittelpunkt zwischen 6,7 und 8,7 Ihr endgültiger interpolierter Wert für Z: 7,7.

Sagen Sie, Sie hatten stattdessen y = 13 und x = 3,8. Dann würden Sie für x die Werte 80% des Weges nehmen, dh:

  • für y = 10, 0,2*5,6+0,8*7,8 -> 7,36

  • für y = 20, 0,2*7,6+0,8*9,8 -> 9,46

Jetzt möchten Sie den z 30% des Weges zwischen diesen, 0,3*7,36 + 0,7*9,46 -> 8,83, das ist z.

Das ist lineare Interpolation, und es ist wirklich sehr einfach. Möchten Sie es von Hand berechnen oder Routinen finden, die dies für Sie tun (gegebenenfalls z. numpy Arrays als "die Gitter")? Selbst im letzteren Fall hoffe ich, dass diese "manuelle" Erklärung (zeigt, was Sie in der elementarsten arithmetischen Begriffe tun) helfen, zu verstehen, was Sie tun ... ;-).

Natürlich gibt es fortgeschrittenere Formen der Interpolation - brauchen Sie diese oder reicht die lineare Interpolation für Ihren Anwendungsfall aus?

Ich würde sagen, nimm einfach den Durchschnitt der Werte um ihn herum. Wenn Sie also x = 3,5 und y = 15 (3,5,15) benötigen, sind Sie durchschnittlich (3,10), (3,20), (4,10) und (4,20). Da ich keine Ahnung habe, mit welchen Daten Sie es zu tun haben, bin ich mir nicht sicher, ob die genaue Nähe von Bedeutung wäre - in diesem Fall können Sie nur mit dem Durchschnitt kleben - oder ob Sie eine Art inverse Entfernung durchführen müssen.

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