ブラックボックス関数の不連続性を見つける最良の方法は何ですか?


20

これは以前に尋ねた数学スタックエクスチェンジよりもこの質問の方が良い場所かもしれないと示唆されました。

指定された間隔どこでも(安価に)評価できるブラックボックス関数があり、ノイズがない(浮動小数点の粒度を除くなど)と仮定します。この機能の不連続性を見つける最良の方法は何でしょうか?不連続点がいくつあるかはわかりませんが、不連続点はないかもしれません。[a,b]

いくつかの簡単な方法(均一なサンプリング、サンプル間に大きな違いがある場合の改良など)を考えることができますが、おそらくもっと良い方法がありますか?

この関数は「合理的」で、高次微分の場合と同じように、最大​​で有限の多くの不連続があると仮定できます。小さな病理学的不連続が見落とされても構いません...(アプリケーションは1d関数の自動プロットです) 。

-

答えてくれたすべての人、特にペドロに感謝します。Pachón、Platte、およびTrefethenで説明されている方法が私にとって最良のアプローチであると思われるので、次に実装します


提案されたメソッドのいずれかがを処理できるかどうか疑問に思う
1x1x
JM

@JM:実装が完了したら、この関数のプロットを追加します。
n00b

@ n00b:この概念は役に立つかもしれません。:mathoverflow.net/q/165038/14414
ラジェッシュDachiraju

回答:


18

Matlabを使用している場合、Chebfunプロジェクトに興味があるかもしれません。Chebfunは関数を取り、それをサンプリングし、多項式補間として表現しようとします。関数に不連続性がある場合、Chebfunはsplitting onコマンドで不連続性を検出できるはずです。ここにいくつかの例を見つけることができます。

基礎となるアルゴリズムに興味がある場合は、Pachón、Platte、およびTrefethenの論文「Piecewise Smooth Chebfuns」を参照してください。


Pedroに感謝します。私はChebfunに精通していますが、これは素晴らしいですが、巨大です(そしてMatlabライセンスを通じて多額の暗黙のコストが伴います)。だから、私は自分で実装するこの問題のための小さなタイトなアルゴリズムを本当に探しています。
n00b

@ n00b:良い点。たとえば、エッジ検出など、基礎となるアルゴリズムを説明するリファレンスをペーパーに追加しました。
ペドロ

ああ、素晴らしい!私はこの論文を見たことはありませんでしたが、私の予想に反して、Chebfun不連続ファインダーは実際にはChebfunsを使用していないようです。私はそれを注意深く読み、対応するコードを調べます....
n00b

11

chebfunアルゴリズムはより実用的であるように思われますが、不連続性を検出するもう1つの方法、つまり離散ウェーブレット変換に言及する必要があります。このMathematicaドキュメントのページを見ると、どのように機能するかがわかります。セクション>アプリケーション>不連続性とエッジの検出を参照してください。

簡単に言えば、均一にサンプリングされたポイントで DWTを取得し、高周波係数を調べることができます。それらの最大のものは、おそらく不連続点に対応しています。f


8

重み付け本質的に非振動(WENO)の方法は、「滑らかさインジケーター」を使用して、有限体積法と差分法の不連続性を検出します。Pedroが提供したChebfunの説明から、一般的な考え方は同じであるように思われます。補間多項式のセットを構築し、それらを使用して滑らかさの尺度を計算します。

GS Jiang、およびCW Shu、重み付けENOスキームの効率的な実装、J.Comput.Phys。、vol。126、pp。202--228、1996。


5

@Pedroとともに、エッジ検出アルゴリズムを調べます。不連続性は導関数上の無限大ですので、ますます細かくメッシュを見て、関心領域をターゲットにすることを検討してください。

メッシュが洗練されるにつれて、連続関数の微分に対する有限差分近似は減少するはずです。メッシュ間の導関数の有限差分結果を比較すると、不連続性を示す勾配の発散が明らかになる可能性があります。

編集:わかりました。したがって、不連続性には無限微分がありますが、無限微分は常に不連続ではありません(例を指摘してくれた@ n00bに感謝します)。以下のような、例えばで、差分は、ステップサイズとして減少する Iがあっても、説明したように、分析微分は連続ではありません。x=0hx0f(x)=sign(x)|x|x=0hx0


1
問題の微妙な点の1つは、不連続性は導関数に無限大があるとみなすことができるが、逆は真ではないことです。関数sign(x)* sqrt(| x |)はx = 0で完全に連続です。しかし誘導体があり、無限である
N00B

また、「連続関数は十分に小さいスケールで滑らかでなければならない」というコメントにも同意しません。滑らかさは連続微分に関係しています。元の関数の連続性は必要条件ですが、十分な条件ではありません。
ジェフオックスベリー

1
@GeoffOxberry:そのステートメントを削除しました。FDでは妥当な結果ですが、分析ではありません。
フィルH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.