値をサンプリングしたい2次元関数あります。この関数は計算が非常に高価であり、複雑な形状を持っているため、最小数のサンプルポイントを使用して、その形状に関する最も多くの情報を取得する方法を見つける必要があります。
これを行うにはどのような良い方法がありますか?
私が今まで持っているもの
関数値をすでに計算している既存のポイントのセットから開始します(これは、ポイントの正方格子などです)。
次に、これらのポイントのドロネー三角形分割を計算します。
ドローネ三角形分割において2つの隣接点が十分に(ある場合)と十分にそれらの関数値が異なる(> Δ F)、私はそれら挟ん新しい点を途中で挿入します。隣接する各ポイントペアに対してこれを行います。
この方法の何が問題になっていますか?
まあ、それは比較的うまく機能しますが、これと似た機能では、サンプルポイントがリッジを「飛び越える」傾向があり、そこに気づかないこともあるため、理想的ではありません。
次のような結果が生成されます(初期ポイントグリッドの解像度が十分に粗い場合)。
上記のプロットは、関数値が計算されるポイント(実際にはそれらの周りのボロノイセル)を示しています。
上記のプロットは、同じ点から生成された線形補間を示し、それをMathematicaの組み込みのサンプリング方法と比較します(ほぼ同じ開始解像度)。
それを改善するには?
ここでの主な問題は、私の方法が勾配に基づいてリファインメントポイントを追加するかどうかを決定することだと思います。
改良点を追加するときは、曲率または少なくとも2次導関数を考慮することをお勧めします。
質問
ポイントの位置がまったく制約されていない場合に、2次導関数または曲率を考慮するための非常に簡単な実装方法は何ですか?(開始点の正方格子は必ずしも必要ではありません。これは理想的には一般的なものでなければなりません。)
または、最適化された方法で絞り込み点の位置を計算する他の簡単な方法はありますか?
これをMathematicaで実装しますが、この質問は主にメソッドに関するものです。「実装しやすい」ビットについては、私がMathematicaを使用していると見なされます(つまり、これはDelaunayの三角形分割を行うためのパッケージがあるため、これまでは簡単でした)
私はこれをどのような実用的な問題に適用していますか
相図を計算しています。複雑な形をしています。ある地域ではその値は0であり、別の地域では0と1の間です。2つの地域間で急激なジャンプがあります(不連続です)。関数がゼロより大きい領域では、滑らかな変動といくつかの不連続性の両方があります。
関数値はモンテカルロシミュレーションに基づいて計算されるため、不正確な関数値またはノイズが予期される場合があります(これは非常にまれですが、多数のポイントでは定常状態に到達しない場合などに発生しますいくつかのランダムな要因)
すでにMathematica.SEでこれを尋ねましたが、まだプライベートベータ版であるため、リンクできません。ここでの質問は、実装ではなくメソッドに関するものです。
@sukiへの返信
これは、あなたが提案する分割のタイプ、つまり、三角形の中央に新しいポイントを置くことですか?
ここでの私の懸念は、領域のエッジで特別な処理が必要なように見えることです。そうしないと、上記のように非常に長くて非常に細い三角形が得られます。これを修正しましたか?
更新
私が説明する方法と、三角形に基づいて細分割を行い、三角形内に細分割ポイントを配置するという@sukiの提案の両方に現れる問題は、不連続がある場合(私の問題のように)、ステップの後にドローネ三角形分割を再計算することです3つの頂点で異なる関数値を持つ三角形が変更され、おそらくいくつかの大きな三角形が表示されます。
以下に2つの例を示します。
最初の例は、真っ直ぐな不連続の周りでサンプリングしたときの最終結果を示しています。2番目は、同様のケースのサンプリングポイント分布を示しています。
これを回避する簡単な方法は何ですか?現在、私は単純に再三角形分割後に消えるそれらのエーグを細分化していますが、これはハックのように感じ、対称メッシュ(正方形グリッドなど)の場合にはいくつかの有効なDelaunay三角形分割があるため、エッジが変更される可能性があるため、注意して行う必要があります再三角測量後、ランダムに。