У меня есть двумерная функция , значения которой я хотел бы попробовать. Функция очень дорога в вычислении и имеет сложную форму, поэтому мне нужно найти способ получить наибольшую информацию о ее форме, используя наименьшее количество точек выборки.
Какие хорошие методы есть, чтобы сделать это?
Что у меня пока
Я начинаю с существующего набора точек, где я уже вычислил значение функции (это может быть квадратная решетка точек или что-то еще).
Затем я вычисляю триангуляцию Делоне этих точек.
Если две соседние точки в триангуляции Делоне достаточно далеко ( ) и значение функции отличается достаточно в них ( > Δ F ), а затем вставить новую точку на полпути Inbetween них. Я делаю это для каждой соседней пары точек.
Что не так с этим методом?
Ну, это работает относительно хорошо, но на функциях, подобных этой, это не идеально, потому что точки выборки имеют тенденцию «перепрыгивать» через гребень и даже не замечать, что это там.
Это дает такие результаты (если разрешение исходной точечной сетки достаточно грубое):
На приведенном выше графике показаны точки, где вычисляется значение функции (на самом деле ячейки Вороного вокруг них).
Этот график выше показывает линейную интерполяцию, сгенерированную из тех же точек, и сравнивает ее со встроенным в Mathematica методом выборки (для примерно одинакового начального разрешения).
Как это улучшить?
Я думаю, что основная проблема заключается в том, что мой метод решает, добавлять ли точку уточнения или нет на основе градиента.
Было бы лучше учесть кривизну или, по крайней мере, вторую производную при добавлении точек уточнения.
Вопрос
Что является очень простым для реализации способом учета второй производной или кривизны, когда местоположение моих точек вообще не ограничено? (У меня не обязательно квадратная решетка начальных точек, в идеале это должно быть общим.)
Или какие другие простые способы можно рассчитать положение точек уточнения оптимальным образом?
Я собираюсь реализовать это в Mathematica, но этот вопрос в основном о методе. Для бита «легко реализовать» считается, что я использую Mathematica (т.е. это было легко сделать до сих пор, потому что у него есть пакет для выполнения триангуляции Делоне)
К какой практической проблеме я применяю это
Я рассчитываю фазовую диаграмму. Он имеет сложную форму. В одном регионе его значение равно 0, в другом - от 0 до 1. Между двумя регионами наблюдается резкий скачок (он прерывистый). В области, где функция больше нуля, есть как плавное изменение, так и пара разрывов.
Значение функции рассчитывается на основе симуляции Монте-Карло, поэтому иногда следует ожидать неправильного значения функции или шума (это очень редко, но для большого числа точек это происходит, например, когда устойчивое состояние не достигается из-за какой-то случайный фактор)
Я уже спрашивал об этом на Mathematica.SE, но не могу дать ссылку на него, потому что он все еще находится в частной бета-версии. Этот вопрос здесь о методе, а не о реализации.
Ответить @suki
Вы предлагаете этот тип деления, то есть ставите новую точку в середине треугольников?
Меня беспокоит то, что, по-видимому, требуется особая обработка на краях региона, иначе это даст очень длинные и очень тонкие треугольники, как показано выше. Вы исправили это?
ОБНОВИТЬ
Проблема, возникающая как в описанном мною методе, так и в предложении @ suki поместить подразделение на основе треугольников и поместить точки разделения в треугольник, состоит в том, что при наличии разрывов (как в моей задаче) повторный расчет триангуляции Делоне после шага может вызвать изменение треугольников и, возможно, появление больших треугольников, которые имеют разные значения функций в трех вершинах.
Вот два примера:
Первый показывает конечный результат при выборке вокруг прямой несплошности. Второй показывает распределение точек выборки для аналогичного случая.
Какие есть простые способы избежать этого? В настоящее время я просто подразделяю те egdes, которые исчезают после ретриангуляции, но это похоже на хак и должно быть сделано с осторожностью, так как в случае симметричных сеток (например, квадратной сетки) существует несколько допустимых триангуляций Делоне, следовательно, ребра могут измениться случайно после ретриангуляции.