Ho una serie di punti 3D che definiscono un contorno 3D. Quello che voglio fare è ottenere la rappresentazione superficiale minima corrispondente a questo profilo (see Minimal Surfaces in Wikipedia). Fondamentalmente ciò richiede di risolvere un'equazione differenziale parziale non lineare.Soluzione di superficie minima in Python
In Matlab questo è quasi immediato utilizzando la funzione pdenonlin
(see Matlab's documentation). Un esempio del suo utilizzo per risolvere un problema superficiale minimo può essere trovato qui: Minimal Surface Problem on the Unit Disk.
Ho bisogno di fare una tale implementazione in Python, ma fino a sapere che non ho trovato alcuna risorsa web su come farlo.
Qualcuno può indicarmi risorse/esempi di tale implementazione?
Grazie, Miguel.
UPDATE
La superficie 3D (idealmente una rappresentazione maglia triangolare) voglio trovare è delimitata da questo insieme di punti 3D (come si vede in tale figura, i punti giacciono nel piano best-fit) :
Ok, così facendo qualche ricerca ho scoperto che questo problema superficie minima è correlato con la soluzione del Biharmonic Equation, e ho anche scoperto che il Thin-plate spline è la soluzione fondamentale per questa equazione.
Quindi penso che l'approccio sarebbe quello di provare ad adattare questa rappresentazione sparsa della superficie (data dal contorno 3D dei punti) usando spline sottili. Ho trovato this example in scipy.interpolate dove i dati sparsi (formato x, y, z) sono interpolati usando spline sottili per ottenere le coordinate ZI su una griglia uniforme (XI, YI).
Due domande: (1) L'interpolazione con spline sottili sarebbe l'approccio corretto per il problema di calcolare la superficie dall'insieme di punti di contorno 3D? (2) In caso affermativo, come eseguire l'interpolazione su lastra sottile su scipy con una griglia NON UNIFORME?
Grazie ancora! Miguel
UPDATE: ATTUAZIONE IN MATLAB (MA NON FUNZIONA SU SciPy Python)
ho seguito this example utilizzando la funzione di Matlab tpaps
e ottenuto la superficie minima montato il mio contorno su una griglia uniforme. Questo è il risultato in Matlab (sembra grande!):
però ho bisogno di implementare questo in Python, quindi sto usando il pacchetto scipy.interpolate.Rbf e la funzione thin-plate
.Ecco il codice in pitone (XYZ
contiene le coordinate 3D di ciascun punto del contorno):
GRID_POINTS = 25
x_min = XYZ[:,0].min()
x_max = XYZ[:,0].max()
y_min = XYZ[:,1].min()
y_max = XYZ[:,1].max()
xi = np.linspace(x_min, x_max, GRID_POINTS)
yi = np.linspace(y_min, y_max, GRID_POINTS)
XI, YI = np.meshgrid(xi, yi)
from scipy.interpolate import Rbf
rbf = Rbf(XYZ[:,0],XYZ[:,1],XYZ[:,2],function='thin-plate',smooth=0.0)
ZI = rbf(XI,YI)
tuttavia questo è il risultato (molto diverso da quello ottenuto in Matlab):
È evidente che il risultato di scipy non corrisponde ad una superficie minima.
Scipy.interpolate.Rbf + lastra sottile funziona come previsto, perché differisce dal risultato di Matlab?
Qual è esattamente la relazione tra i tuoi punti 3D e l'output desiderato? Avete punti che si trovano approssimativamente sulla superficie minima e state cercando una descrizione algebrica di quella superficie? Oppure i punti descrivono una sorta di limite e stai cercando la superficie minima definita da quel confine? Che forma dovrebbe avere il tuo output? Potrebbe essere utile vedere l'intero codice MATLAB, in modo che si possa cercare il modo di tradurre ciò anche senza comprendere l'interpretazione come superfici minime. Https://launchpad.net/cbcpdesys sembra utile? – MvG
@MvG: vedere più dettagli nella mia domanda aggiornata. (1) I punti si trovano approssimativamente sulla superficie minima; (2) I punti descrivono il limite della superficie, non ancora ottenuta, (3) Idealmente il tipo di superficie che voglio ottenere è una rappresentazione a maglia triangolare. – CodificandoBits
Prova anche a chiedere in http://scicomp.stackexchange.com. – lhf