Каков наилучший способ найти разрывы функции черного ящика?

20

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

Предположим, у кого-то есть функция черного ящика, которая может быть оценена в любом месте (дешево) на заданном интервале и не имеет шума (скажем, за исключением детализации с плавающей запятой). Как лучше всего найти разрывы этой функции? Я не знаю, сколько может быть разрывов и не может быть ни одного.[a,b]

Я могу подумать о некоторых простых методах (равномерная выборка, уточнение там, где есть большие различия между выборками, ...), но, возможно, есть лучший способ?

Функция «разумна» в том смысле, что можно предположить, что она имеет не более конечного числа разрывов, то же самое для высших производных, я не против, если пропущены небольшие патологические разрывы ... (приложение представляет собой автоматическое построение 1d-функций) ,

-

Спасибо всем, кто ответил, особенно Педро; метод, описанный в Pachón, Platte и Trefethen, кажется мне лучшим подходом, поэтому сейчас я перейду к его реализации.

n00b
источник
Я должен задаться вопросом, может ли какой-либо из предложенных методов справиться
1x1x
JM
@JM: Я добавлю сюжет этой функции, когда я закончу реализацию.
n00b
@ n00b: эта концепция может оказаться полезной. : mathoverflow.net/q/165038/14414
Раджеш Дачираю

Ответы:

18

Если вы используете Matlab, вас может заинтересовать проект Chebfun . Chebfun берет функцию, выбирает ее и пытается представить ее как полиномиальный интерполант. Если ваша функция имеет разрывы, Chebfun сможет обнаружить их с помощью splitting onкоманды. Вы можете найти несколько примеров здесь .

Если вас интересуют базовые алгоритмы, хорошим справочным материалом является статья Пачона, Платта и Трефетена « Кусочно гладкие Chebfuns ».

Pedro
источник
Спасибо Педро, я знаком с Chebfun, который хорош, но огромен (и идет с огромной неявной ценой через лицензию Matlab). Поэтому я действительно ищу небольшой жесткий алгоритм для этой проблемы, который я бы реализовал сам.
n00b
@ n00b: Хороший вопрос. Я добавил ссылку на статью, описывающую основные алгоритмы, например, для обнаружения краев.
Педро
Ах, отлично! Я не видел эту статью, и, вопреки моим ожиданиям, кажется, что искатель прерывистости Chebfun на самом деле не использует Chebfuns - так что это выглядит в высшей степени пригодным для использования. Я прочитаю его внимательно и проверю соответствующий код ....
n00b
11

Я подозреваю, что алгоритм chebfun должен казаться более практичным, но необходимо упомянуть еще один способ обнаружения разрывов, а именно дискретное вейвлет-преобразование. Вы можете понять, как это работает, заглянув на эту страницу документации Mathematica , см. Раздел> Приложения> Обнаружение разрывов и кромок.

е

faleichik
источник
8

Взвешенные по существу не колебательные (WENO) методы используют «индикаторы гладкости» для обнаружения разрывов в методах конечных объемов и разностей. Из описания Chebfun, которое дал Педро, кажется, что общая идея та же: построить набор интерполирующих многочленов и использовать их для вычисления некоторой меры гладкости.

См. GS Jiang и CW Shu, Эффективная реализация взвешенных схем ENO, J.Comput.Phys., Vol. 126, с. 202-228, 1996.

Мэтью Эмметт
источник
5

Наряду с @Pedro я бы посмотрел на алгоритмы обнаружения краев. Прерывность - это бесконечность для производной, поэтому рассмотрите все более и более мелкую сетку и нацеливание на области интереса.

Приближение конечных разностей производной непрерывной функции должно уменьшаться по мере уточнения сетки. Сравнение результата конечной разности для производной между сетками может затем выявить расхождения в градиенте, которые сигнализируют о разрывах.

f(x)=sign(x)|x|x=0hx0

Фил Х
источник
1
Одна тонкость проблемы состоит в том, что, хотя разрыв можно рассматривать как имеющий бесконечность в производной, обратное неверно - знак функции (x) * sqrt (| x |) совершенно непрерывен при x = 0, но производная там бесконечна
n00b
Я также не согласен с комментарием о том, что «любая непрерывная функция должна быть гладкой в ​​достаточно малом масштабе». Гладкость имеет отношение к непрерывным производным; непрерывность исходной функции является необходимым условием, но не достаточным.
Джефф Оксберри
1
@GeoffOxberry: удалил это утверждение. Это разумный результат в FD, но не аналитически.
Фил Х