Apa cara terbaik untuk menemukan diskontinuitas fungsi kotak hitam?

20

Disarankan bahwa ini mungkin tempat yang lebih baik untuk pertanyaan ini daripada Mathematics Stack Exchange tempat saya bertanya sebelumnya .

Misalkan seseorang memiliki fungsi kotak hitam yang dapat dievaluasi di mana saja (murah) pada interval yang ditentukan dan tidak memiliki noise (kecuali granularity titik apung, katakanlah). Apa cara terbaik untuk menemukan diskontinuitas fungsi ini? Saya tidak tahu ada berapa diskontinuitas dan mungkin tidak ada.[a,b]

Saya dapat memikirkan beberapa metode langsung (sampling seragam, saring di mana ada perbedaan besar antara sampel, ...), tetapi mungkin ada cara yang lebih baik?

Fungsi ini "masuk akal" karena orang dapat berasumsi bahwa ia memiliki paling banyak diskontinuitas, sama untuk turunan yang lebih tinggi, saya tidak keberatan jika diskontinuitas patologis kecil terlewatkan ... (aplikasi ini memplot otomatis fungsi 1d) .

-

Terima kasih kepada semua yang menjawab, khususnya Pedro; metode yang dijelaskan dalam Pachón, Platte dan Trefethen tampaknya menjadi pendekatan terbaik bagi saya, jadi saya pergi sekarang untuk mengimplementasikannya

n00b
sumber
Saya harus bertanya-tanya apakah ada metode yang diusulkan dapat menangani
1x1x
JM
@ JP: Saya akan menambahkan sebidang fungsi ini ketika saya telah menyelesaikan implementasi.
n00b
@ n00b: Anda mungkin menganggap konsep ini bermanfaat. : mathoverflow.net/q/165038/14414
Rajesh Dachiraju

Jawaban:

18

Jika Anda menggunakan Matlab, Anda mungkin tertarik dengan proyek Chebfun . Chebfun mengambil fungsi, mengambil sampelnya dan mencoba untuk merepresentasikannya sebagai interpolasi polinomial. Jika fungsi Anda memiliki diskontinuitas, Chebfun seharusnya dapat mendeteksinya dengan splitting onperintah. Anda dapat menemukan beberapa contoh di sini .

Jika Anda tertarik pada algoritma yang mendasarinya, referensi yang bagus adalah makalah Pachón, Platte dan Trefethen " Piecewise Smooth Chebfuns ".

Pedro
sumber
Terima kasih Pedro, saya kenal dengan Chebfun yang bagus, tetapi besar (dan datang dengan biaya implisit yang besar dan kuat melalui lisensi Matlab). Jadi saya benar-benar mencari algoritma ketat kecil untuk masalah ini yang akan saya terapkan sendiri.
n00b
@ n00b: Poin bagus. Saya telah menambahkan referensi ke makalah yang menjelaskan algoritma yang mendasarinya, misalnya untuk deteksi tepi.
Pedro
Ah, bagus sekali! Saya belum pernah melihat makalah ini dan, bertentangan dengan harapan saya, tampaknya pencari diskontinuitas Chebfun tidak benar-benar menggunakan Chebfun - jadi ini sepertinya dapat digunakan secara nyata. Saya akan membacanya dengan cermat dan memeriksa kode yang sesuai ....
n00b
11

Saya menduga bahwa algoritma chebfun harus tampak lebih praktis, tetapi tidak perlu menyebutkan satu lagi cara untuk mendeteksi diskontinuitas, yaitu transformasi wavelet diskrit. Anda bisa mendapatkan ide bagaimana cara kerjanya dengan melihat halaman dokumentasi Mathematica ini , lihat bagian> Aplikasi> Detect Discontinuities and Edges.

f

faleichik
sumber
8

Metode Weighted Essences Non-Oscillatory (WENO) menggunakan "indikator kelancaran" untuk mendeteksi diskontinuitas dalam volume hingga dan metode perbedaan. Dari uraian Chebfun yang diberikan Pedro, tampaknya gagasan umumnya sama: membangun seperangkat polinomial yang diinterpolasi dan menggunakannya untuk menghitung beberapa tingkat kelancaran.

Lihat GS Jiang, dan CW Shu, Penerapan efisien skema ENO tertimbang, J.Comput.Phys., Vol. 126, hlm. 202-228, 1996.

Matthew Emmett
sumber
5

Bersama dengan @Pedro, saya akan melihat algoritma deteksi tepi. Diskontinuitas adalah ketidakterbatasan turunan, jadi pertimbangkan untuk melihat jaring yang semakin halus dan menargetkan wilayah yang diminati.

Perkiraan perbedaan hingga turunan dari fungsi kontinu harus dikurangi ketika mesh dimurnikan. Membandingkan hasil perbedaan hingga untuk turunan antara jerat kemudian dapat mengungkapkan divergensi dalam gradien yang menandakan diskontinuitas.

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

Phil H
sumber
1
Salah satu kehalusan dari masalahnya adalah bahwa, meskipun diskontinuitas dapat dilihat memiliki infinity dalam turunannya, kebalikannya tidak benar - tanda fungsi (x) * sqrt (| x |) kontinu sempurna pada x = 0, tetapi turunannya tidak terbatas di sana
n00b
Saya juga tidak setuju dengan komentar bahwa "fungsi kontinu apa pun harus lancar pada skala yang cukup kecil". Kelancaran berkaitan dengan turunan kontinu; kesinambungan fungsi asli adalah kondisi yang diperlukan, tetapi tidak cukup.
Geoff Oxberry
1
@ GeoffOxberry: menghapus pernyataan itu. Ini hasil yang masuk akal dalam FD, tetapi tidak secara analitis.
Phil H