У меня есть набор трехмерных точек, определяющих трехмерный контур. Я хочу получить минимальное представление поверхности, соответствующее этому контуру (см. Минимальные поверхности в Википедии) а>. В основном это требует решения нелинейного уравнения в частных производных.
В Matlab это почти просто использовать pdenonlin
функцию (см. Документацию Matlab). Пример его использования для решения проблемы с минимальной поверхностью можно найти здесь: Минимальные проблемы с поверхностью на блочном диске.
Мне нужно сделать такую реализацию на Python, но, насколько мне известно, я не нашел никаких веб-ресурсов о том, как это сделать.
Может ли кто-нибудь указать мне какие-либо ресурсы / примеры такой реализации?
Спасибо, Мигель.
ОБНОВЛЕНИЕ
Трехмерная поверхность (в идеале треугольная сетка), которую я хочу найти, ограничена этим набором трехмерных точек (как видно на этом рисунке, точки лежат в наиболее подходящей плоскости):
Итак, проведя небольшое исследование, я обнаружил, что эта минимальная поверхностная проблема связана с решением Бигармонического уравнения, и я также обнаружил, что Тонкопластинчатый шлиц является фундаментальным решением этого уравнения.
Поэтому я думаю, что подход будет заключаться в том, чтобы попытаться подогнать это разреженное представление поверхности (заданное трехмерным контуром точек) с помощью шлицев из тонких пластин. Я нашел этот пример в scipy.interpolate где разрозненные данные (формат x, y, z) интерполируются с использованием шлицев тонких пластин для получения координат ZI на однородной сетке (XI, YI).
Возникают два вопроса: (1) Будет ли сплайн-интерполяция тонкой пластины правильным подходом к проблеме вычисления поверхности по набору точек трехмерного контура? (2) Если да, то как выполнить интерполяцию тонкой пластины на scipy с НЕОДНОРОДНОЙ сеткой?
Спасибо еще раз! Мигель
ОБНОВЛЕНИЕ: РЕАЛИЗАЦИЯ В MATLAB (НО НЕ РАБОТАЕТ НА SCIPY PYTHON)
Я подписался на этот пример с помощью tpaps
функции Matlab и получил минимальную поверхность, подходящую к моему контуру на однородной сетке. Это результат в Matlab (выглядит отлично!):
Однако мне нужно реализовать это на Python, поэтому я использую пакет scipy.interpolate.Rbf и функцию thin-plate
. Вот код на python (XYZ
содержит трехмерные координаты каждой точки контура):
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)
Однако это результат (совершенно отличный от полученного в Matlab):
Очевидно, что результат scipy не соответствует минимальной поверхности.
Scipy.interpolate.Rbf + thin-plate работает так, как ожидалось, почему он отличается от результата Matlab?