2 Dimensional Interpolationsproblem
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
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.