with tutorial framework español djangoproject desde con cero applications python geometry interpolation mesh differential-equations

python - framework - tutorial django



Solución de superficie mínima en Python (2)

La pregunta afirma que necesitamos resolver una ecuación diferencial parcial no lineal. Sin embargo, Wikipedia afirma que "son difíciles de estudiar: casi no hay técnicas generales que funcionen para todas estas ecuaciones, y generalmente cada ecuación individual debe estudiarse como un problema separado". Sin embargo, usted no dio la ecuación! ¿Y utiliza Matlab a veces algoritmos genéticos para llegar a sus superficies? Es decir, ¿utiliza una regla general para hacer una mejor suposición y luego prueba pequeñas variaciones en los cuadrados de componentes hasta que no se pueda encontrar una superficie más pequeña? Implementar ese tipo de solución sería laborioso pero no conceptualmente difícil (suponiendo que te guste ese tipo de cosas). También recuerde que el cálculo de funciones continuas es solo un caso especial del cálculo de todas las aproximaciones lineales de funciones (el incremento se establece en cero en lugar de algún valor finito). Esto se me aclaró al leer los libros de JL Bell en un análisis infinitesimal suave: solo use ese álgebra con incrementos finitos y deje los factores resultantes en las derivaciones en lugar de ''descuidarlos''.

Tengo un conjunto de puntos 3D que definen un contorno 3D. Lo que quiero hacer es obtener la representación de superficie mínima correspondiente a este contorno (ver Superficies mínimas en Wikipedia) . Básicamente esto requiere resolver una ecuación diferencial parcial no lineal.

En Matlab esto es casi sencillo utilizando la función pdenonlin (consulte la documentación de Matlab) . Un ejemplo de su uso para resolver un problema de superficie mínimo se puede encontrar aquí: Problema de superficie mínimo en el disco de la unidad .

Necesito realizar dicha implementación en Python, pero hasta ahora no he encontrado ningún recurso web sobre cómo hacerlo.

¿Alguien puede señalarme algún recurso / ejemplo de tal implementación?

Gracias miguel

ACTUALIZAR

La superficie 3D (idealmente una representación de malla triangular) que quiero encontrar está limitada por este conjunto de puntos 3D (como se ve en esta figura, los puntos se encuentran en el plano de mejor ajuste):

Bueno, al hacer algunas investigaciones, descubrí que este problema de superficie mínimo está relacionado con la solución de la Ecuación Biharmónica , y también encontré que la spline de placa delgada es la solución fundamental para esta ecuación.

Así que creo que el enfoque sería tratar de ajustar esta representación dispersa de la superficie (dada por el contorno 3D de puntos) utilizando splines de placa delgada. Encontré este ejemplo en scipy.interpolate donde los datos dispersos (formato x, y, z) se interpolan usando splines de placa delgada para obtener las coordenadas ZI en una cuadrícula uniforme (XI, YI).

Surgen dos preguntas: (1) ¿Sería la interpolación por spline de placa delgada el enfoque correcto para el problema de calcular la superficie a partir del conjunto de puntos de contorno 3D? (2) Si es así, ¿cómo realizar la interpolación de placa delgada en scipy con una cuadrícula NO UNIFORME?

¡Gracias de nuevo! Miguel

ACTUALIZACIÓN: IMPLEMENTACIÓN EN MATLAB (PERO NO FUNCIONA EN STHE PYTHON)

Seguí este ejemplo utilizando la función tpaps de Matlab y obtuve la superficie mínima ajustada a mi contorno en una cuadrícula uniforme. Este es el resultado en Matlab (se ve muy bien!):

Sin embargo, necesito implementar esto en Python, así que estoy usando el paquete scipy.interpolate.Rbf y la función de thin-plate . Aquí está el código en python ( XYZ contiene las coordenadas 3D de cada punto en el 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)

Sin embargo, este es el resultado (muy diferente del obtenido en Matlab):

Es evidente que el resultado de scipy no corresponde a una superficie mínima.

¿Scipy.interpolate.Rbf + thin-plate está haciendo lo esperado, por qué se diferencia del resultado de Matlab?


Obviamente, Matlab y SciPy entienden el TPS de diferentes maneras. La implementación de Matlab parece correcta. SciPy trata el TPS de la misma manera que otros RBF, de modo que usted mismo podría implementarlo correctamente en Python; sería suficiente formar una matriz del sistema de ecuaciones lineales relacionadas y resolverlo para recibir los coeficientes de TPS.