Interpolation von Daten auf ein Meshgrid ohne Extrapolation (Numpy, Matplotlib, Scipy)

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
selinofant
User
Beiträge: 1
Registriert: Sonntag 19. Mai 2024, 09:43

Ich habe das Problem, dass ich gerne Daten auf ein Meshgrid interpolieren möchte, diese aber nicht extrapoliert werden sollen, sondern nur zwischen vorhandenen Datenwerten interpoliert werden soll.

Konkret ist es folgendes Problem: Ich habe l, h und u werte. l und h spannen ein Querprofil auf und haben verschiedene geschwindigkeitswerte (u) die ich gern als Konturplot darstellen mag.

Ich denke die wichtigsten Teile meines Codes dabei sind

Code: Alles auswählen

grid_x1, grid_y1 = np.mgrid[min(l1):max(l1):1391j, min(h1):max(h1):23j]
grid_x2, grid_y2 = np.mgrid[min(l2):max(l2):1786j, min(h2):max(h2):31j]

matrix1 = np.vstack([l1, h1]).T
matrix2 = np.vstack([l2, h2]).T
vel1 = griddata(matrix1, u1, (grid_x1, grid_y1), method="nearest", fill_value=np.nan)
vel2 = griddata(matrix2, u2, (grid_x2, grid_y2), method="nearest", fill_value=np.nan)
und so erstelle ich beispielsweise einen Konturplot

Code: Alles auswählen

fig, axs = plt.subplots(nrows=3, ncols=1, layout="constrained")
fig.suptitle("Profil XS 2 - Vergleich Netz 2-0 und 2-1")
ax = axs[0]
contour = ax.contourf(grid_x1, grid_y1, vel1, levels=np.linspace(0, 2, 101), cmap=cm)
cbar = plt.colorbar(contour)
cbar.set_label("U Magnitude [m/s]")
cbar.set_ticks([0, 0.5, 1, 1.5, 2])
ax.xaxis.set_inverted(True)
ax.set_title("Netz 2-0")
ax.set_aspect(10/1)

aktuelle habe ich 2 Datensätze eingeladen und es passiert beim ersten datensatz genau das was passieren soll: Alle Punkte außerhalb des Profils haben eine Geschwindigkeit von 0, alle innerhalb nicht. Beim zweiten ist das aber nicht so und die Punkte außerhalb bekommen die Geschwindigkeit vom untersten Wert zugeschrieben.
Das Profil ist quasi so aufgebaut, dass die "oberen Werte" alle eine einheitliche Höhe haben, die unteren aber verschiedene Höhen. Es ist also kein klassisches Recheck sondern eher ... hügelig.
Und bei den meisten datensätzen bekommen die Punkte außerhalb des profils eben den Wert des letzten punktes innerhalb des Profils zugeschrieben.


Cubic und linear habe ich auch schon als Interpolationsmethode ausprobiert, aber das klappt auch nicht.
Bei Cubic werden die Werte selbst eher falsch interpoliert und auf einmal sind da Datenspitzen die nicht da sein sollten.
Bei linear ist das problem nicht so extrem wie bei nearest, aber auch vorhanden.

Ich hoffe ich konnte mein Problem halbwegs verständlich erklären ... bilder hochladen geht leider nicht, sonst wäre es etwas einfacher :D
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Linear und Qubic spannt halt ein Netz auf, zwischen dessen Knoten interpoliert wird.
Nearest ist aber keine Interpolation, sondern es wird nur der nächstliegende Knotenpunkt gesucht.
Wenn man eine kontinuierliche Funktion u(l,h) hat, dann möchte man meist eine möglichst gute Interpolation, und keine Sprünge. Linear hat keine Sprünge und Qubic hat zusätzlich keine Sprünge in der ersten Ableitung; neigt aber auch dazu, dass es Überschwinger geben kann. Kommt halt auf den Anwendungsfall an. Wenn Du "Datenspitzen" hast, dann sind Dein Ausgangsdaten schon keine Werte einer kontinuierliche Funktion; kann bei Messungen passieren, so dass man nicht interpolieren sollte, sondern eher fitten.
Und bei Messwerten stellt sich dann die Frage, was das Definitionsgebiet Deiner Messung ist und nur auf diesem Gebiet macht es Sinn, sich Zahlen generieren zu lassen. Das ist also ein weiterer Input.
Antworten