Qual è il modo migliore per trovare le discontinuità di una funzione black-box?


20

È stato suggerito che questo potrebbe essere un posto migliore per questa domanda rispetto allo scambio di stack matematico dove l'ho chiesto prima .

Supponiamo che uno abbia una funzione di scatola nera che può essere valutata ovunque (a buon mercato) in un intervallo specificato e non ha rumore (tranne la granularità in virgola mobile, diciamo). Quale sarebbe il modo migliore per trovare le discontinuità di questa funzione? Non so quante discontinuità potrebbero esserci e potrebbero non essercene.[a,b]

Posso pensare ad alcuni metodi semplici (campionamento uniforme, perfezionare dove ci sono grandi differenze tra i campioni, ...), ma forse c'è un modo migliore?

La funzione è "ragionevole" in quanto si potrebbe presumere che abbia al massimo finitamente molte discontinuità, lo stesso per i derivati ​​più elevati, non mi importa se mancano piccole discontinuità patologiche ... (l'applicazione è la stampa automatica di funzioni 1d) .

-

Grazie a tutti coloro che hanno risposto, in particolare Pedro; il metodo descritto in Pachón, Platte e Trefethen sembra essere l'approccio migliore per me, quindi vado ora a implementarlo


Mi chiedo se uno dei metodi proposti sia in grado di gestire
1x1x
JM,

@JM: aggiungerò un diagramma di questa funzione al termine dell'implementazione.
n00b,

@ n00b: potresti trovare utile questo concetto. : mathoverflow.net/q/165038/14414
Rajesh Dachiraju il

Risposte:


18

Se stai usando Matlab, potresti essere interessato al progetto Chebfun . Chebfun prende una funzione, la campiona e cerca di rappresentarla come un interpolante polinomiale. Se la tua funzione ha discontinuità, Chebfun dovrebbe essere in grado di rilevarle con il splitting oncomando. Puoi trovare alcuni esempi qui .

Se sei interessato agli algoritmi sottostanti, un buon riferimento è l'articolo di Pachón, Platte e Trefethen " Piecewise Smooth Chebfuns ".


Grazie Pedro, ho familiarità con Chebfun che è fantastico, ma enorme (e viene fornito con un costo implicito pesante tramite la licenza Matlab). Quindi sto davvero cercando un piccolo algoritmo stretto per questo problema che implementerei da solo.
n00b

@ n00b: buon punto. Ho aggiunto un riferimento al documento che descrive gli algoritmi sottostanti, ad esempio per il rilevamento dei bordi.
Pedro

Ah, eccellente! Non avevo visto questo documento e, contrariamente alle mie aspettative, sembra che il cercatore di discontinuità di Chebfun non utilizzi effettivamente Chebfuns, quindi questo sembra essere eminentemente utilizzabile. Lo leggerò attentamente e ispezionerò il codice corrispondente ....
n00b

11

Sospetto che l'algoritmo chebfun debba sembrare più pratico, ma è necessario menzionare un altro modo per rilevare le discontinuità, vale a dire la discreta trasformazione wavelet. Puoi avere un'idea di come funziona guardando questa pagina della documentazione di Mathematica , vedi sezione> Applicazioni> Rileva discontinuità e bordi.

f


8

I metodi ponderati essenzialmente non oscillatori (WENO) utilizzano "indicatori di scorrevolezza" per rilevare discontinuità nel volume finito e metodi di differenza. Dalla descrizione di Chebfun data da Pedro, sembra che l'idea generale sia la stessa: costruire un insieme di polinomi interpolati e usarli per calcolare una certa levigatezza.

Vedi GS Jiang e CW Shu, Implementazione efficiente di schemi ENO ponderati, J.Comput.Phys., Vol. 126, pagg. 202-228, 1996.


5

Insieme a @Pedro, vorrei esaminare gli algoritmi di rilevamento dei bordi. Una discontinuità è un'infinità sul derivato, quindi considera di guardare a una mesh sempre più sottile e di indirizzare le regioni di interesse.

L'approssimazione della differenza finita alla derivata di una funzione continua dovrebbe ridursi quando la mesh viene perfezionata. Il confronto del risultato della differenza finita per la derivata tra maglie potrebbe quindi rivelare divergenze nel gradiente che segnalano discontinuità.

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


1
Una sottigliezza del problema è che, sebbene una discontinuità possa essere vista come un'infinità nella derivata, non è vero il contrario: il segno di funzione (x) * sqrt (| x |) è perfettamente continuo in x = 0, ma la derivata è infinita lì
n00b

Sono anche in disaccordo con il commento che "qualsiasi funzione continua dovrebbe essere regolare su scala sufficientemente piccola". La scorrevolezza ha a che fare con derivati ​​continui; la continuità della funzione originale è una condizione necessaria, ma non sufficiente.
Geoff Oxberry,

1
@GeoffOxberry: rimossa quella dichiarazione. È un risultato ragionevole in FD, ma non analiticamente.
Phil H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.