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