Подтвердить что ты не робот

Минимальное поверхностное решение в Python

У меня есть набор трехмерных точек, определяющих трехмерный контур. Я хочу сделать, чтобы получить минимальное поверхностное представление, соответствующее этому контуру (см. "Минимальные поверхности в Википедии" ). В основном это требует решения нелинейного уравнения в частных производных.

В Matlab это почти просто, используя функцию pdenonlin (см. документацию Matlab). Пример его использования для решения проблемы минимальной поверхности можно найти здесь: Минимальная проблема с поверхностью на диске устройства.

Мне нужно сделать такую ​​реализацию на Python, но знаю, что я не нашел никаких веб-ресурсов о том, как это сделать.

Может ли кто-нибудь указать мне какие-либо ресурсы/примеры такой реализации?

Спасибо, Мигель.

UPDATE

3D-поверхность (в идеале треугольное представление сетки), которую я хочу найти, ограничена этим набором трехмерных точек (как видно на этом рисунке, точки лежат в плоскости наилучшего соответствия):

enter image description here

Хорошо, поэтому, проведя некоторое исследование, я обнаружил, что эта минимальная поверхностная проблема связана с решением уравнения Бигармоническое уравнение, и я также нашел что Тонкопленочный сплайн является фундаментальным решением этого уравнения.

Поэтому я думаю, что подход должен был бы попытаться подогнать это разреженное представление поверхности (заданное трехмерным контуром точек) с использованием тонкопленочных сплайнов. Я нашел этот пример в scipy.interpolate, где разбросанные данные (x, y, z format) интерполируются с использованием тонкопленочных сплайнов для получения ZI координаты на единой сетке (XI, YI).

Возникают два вопроса: (1) Будет ли тонкопластинчатая сплайн-интерполяция правильным подходом к проблеме вычисления поверхности из множества точек 3D-контура? (2) Если да, то как выполнить тонкопластинную интерполяцию на scipy с сетью NON-UNIFORM?

Еще раз спасибо! Miguel

ОБНОВЛЕНИЕ: РЕАЛИЗАЦИЯ В MATLAB (НО ЭТО НЕ РАБОТАЕТ НА ПИТОНЕ SCIPY)

Я следил за этот пример с использованием функции Matlab tpaps и получил минимальную поверхность, установленную на мой контур на единой сетке. Это результат в Matlab (отлично выглядит!): enter image description here

Однако мне нужно реализовать это в 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):

enter image description here

Очевидно, что скудный результат не соответствует минимальной поверхности.

Является ли scipy.interpolate.Rbf + тонкой пластинкой, как ожидалось, почему она отличается от результата Matlab?

4b9b3361

Ответ 1

В вопросе говорится, что нам нужно решить нелинейное уравнение в частных производных. Однако в Википедии говорится, что "их трудно изучать: для всех таких уравнений практически нет общих техник, и обычно каждое отдельное уравнение должно изучаться как отдельная проблема". Однако вы не дали уравнения! И иногда Matlab использует генетические алгоритмы для достижения своих поверхностей? То есть, использует ли это правило для того, чтобы лучше всего догадаться, а затем пытается внести небольшие изменения в квадраты компонентов, пока не будет найдена меньшая поверхность. Реализация такого решения была бы кропотливой, но не концептуально сложной (предполагая, что вам нравится такая штука). Также помните, что исчисление непрерывных функций является лишь частным случаем исчисления всех линейных аппроксимаций функций (приращение устанавливается на нуль вместо некоторого конечного значения). Это было ясно для меня, прочитав книги Дж. Л. Белла о гладком бесконечно малом анализе - просто используйте эту алгебру с конечными приращениями и оставляйте результирующие факторы в выводах вместо "пренебрежения" ими.

Ответ 2

Очевидно, что Matlab и SciPy понимают TPS по-разному. Реализация Matlab выглядит правильно. SciPy рассматривает TPS так же, как и другие RBF, так что вы можете реализовать его правильно в Python самостоятельно - этого было бы достаточно, чтобы сформировать матрицу связанной системы линейных уравнений и решить ее для получения коэффициентов TPS.