¿Cuál es la mejor manera de encontrar discontinuidades de una función de caja negra?


20

Se sugirió que este podría ser un mejor lugar para esta pregunta que Mathematics Stack Exchange, donde lo pregunté antes .

Supongamos que uno tiene una función de recuadro negro que puede evaluarse en cualquier lugar (a bajo costo) en un intervalo especificado y no tiene ruido (excepto la granularidad de punto flotante, por ejemplo). ¿Cuál sería la mejor manera de encontrar las discontinuidades de esta función? No sé cuántas discontinuidades puede haber y puede que no haya ninguna.[a,b]

Puedo pensar en algunos métodos sencillos (muestreo uniforme, refinar donde hay grandes diferencias entre las muestras, ...), pero ¿tal vez hay una mejor manera?

La función es "razonable", ya que se podría suponer que tiene como máximo muchas discontinuidades, lo mismo para derivados más altos, no me importa si se pierden pequeñas discontinuidades patológicas ... (la aplicación es el trazado automático de funciones 1d) .

-

Gracias a todos los que respondieron, particularmente a Pedro; El método descrito en Pachón, Platte y Trefethen parece ser el mejor enfoque para mí, así que ahora voy a implementarlo


Tengo que preguntarme si alguno de los métodos propuestos puede manejar
1x1x
JM

@JM: Agregaré un diagrama de esta función cuando haya terminado la implementación.
n00b

@ n00b: este concepto puede resultarle útil. : mathoverflow.net/q/165038/14414
Rajesh Dachiraju

Respuestas:


18

Si está usando Matlab, puede estar interesado en el proyecto Chebfun . Chebfun toma una función, la muestra y trata de representarla como un interpolante polinómico. Si su función tiene discontinuidades, Chebfun debería poder detectarlas con el splitting oncomando. Puedes encontrar algunos ejemplos aquí .

Si está interesado en los algoritmos subyacentes, una buena referencia es el artículo de Pachón, Platte y Trefethen " Piecewise Smooth Chebfuns ".


Gracias Pedro, estoy familiarizado con Chebfun, que es genial, pero enorme (y viene con un costo implícito considerable a través de la licencia de Matlab). Así que realmente estoy buscando un pequeño algoritmo ajustado para este problema que implementaría yo mismo.
n00b

@ n00b: Buen punto. He agregado una referencia al documento que describe los algoritmos subyacentes, por ejemplo, para la detección de bordes.
Pedro

Ah, excelente! No había visto este documento y, en contra de mis expectativas, parece que el buscador de discontinuidades Chebfun en realidad no usa Chebfuns, por lo que parece ser eminentemente utilizable. Lo leeré detenidamente e inspeccionaré el código correspondiente ....
n00b

11

Sospecho que el algoritmo chebfun debe parecer más práctico, pero es necesario mencionar una forma más de detectar discontinuidades, a saber, la transformada de wavelet discreta. Puede hacerse una idea de cómo funciona mirando esta página de documentación de Mathematica , consulte la sección> Aplicaciones> Detectar discontinuidades y bordes.

f


8

Los métodos ponderados esencialmente no oscilatorios (WENO) utilizan "indicadores de suavidad" para detectar discontinuidades en el volumen finito y los métodos de diferencia. Según la descripción de Chebfun que dio Pedro, parece que la idea general es la misma: construir un conjunto de polinomios interpoladores y usarlos para calcular alguna medida de suavidad.

Ver GS Jiang, y CW Shu, Implementación eficiente de esquemas ponderados de ENO, J.Comput.Phys., Vol. 126, págs. 202-228, 1996.


5

Junto con @Pedro, vería los algoritmos de detección de bordes. Una discontinuidad es un infinito en la derivada, así que considere mirar una malla cada vez más fina y apuntar a las regiones de interés.

La aproximación de diferencia finita a la derivada de una función continua debería reducirse a medida que se refina la malla. La comparación del resultado de diferencia finita para la derivada entre mallas podría revelar divergencias en el gradiente que indican discontinuidades.

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


1
Una sutileza del problema es que, aunque se puede ver que una discontinuidad tiene un infinito en la derivada, lo contrario no es cierto: el signo de función (x) * sqrt (| x |) es perfectamente continuo en x = 0, pero la derivada es infinita allí
n00b

También estoy en desacuerdo con el comentario de que "cualquier función continua debería ser suave a una escala suficientemente pequeña". La suavidad tiene que ver con derivados continuos; La continuidad de la función original es una condición necesaria, pero no suficiente.
Geoff Oxberry

1
@ GeoffOxberry: eliminó esa declaración. Es un resultado razonable en FD, pero no analíticamente.
Phil H
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.