16

(注: これはコミュニティ Wiki を意図しています。)

一連の点xi = { x0 , x1 , x2 ,... xn } と対応する関数値fi = f(xi) = { f0 , f1 , f2 ,..., fn } があるとします。ここでf ( x ) は、一般に未知の関数です。(状況によっては、f ( x ) が事前にわかっている場合もありますが、 f ( x )事前にわからないことが多いため、これを一般的に行いたいと考えています。 ) f (x ) 各点でxi ? つまり、各点xiでdfi == d/d x fi == d f ( xi )/d xの値をどのように推定できますか?

残念ながら、MATLAB には非常に優れた汎用の数値微分ルーチンがありません。この理由の一部は、おそらく、適切なルーチンを選択するのが難しいためです!

では、どのような方法があるのでしょうか。どのようなルーチンが存在しますか? 特定の問題に対する適切なルーチンをどのように選択できますか?

MATLAB で微分する方法を選択する際には、いくつかの考慮事項があります。

  1. シンボリック関数または一連の点がありますか?
  2. グリッドの間隔は均等ですか、それとも不均等ですか?
  3. ドメインは定期的ですか? 周期境界条件を仮定できますか?
  4. どのレベルの精度を求めていますか? 与えられた許容範囲内で導関数を計算する必要がありますか?
  5. 関数が定義されているのと同じ点で導関数が評価されることは重要ですか?
  6. デリバティブの複数のオーダーを計算する必要がありますか?

続行するための最良の方法は何ですか?

4

2 に答える 2

20

これらは、いくつかの簡単な提案にすぎません。うまくいけば、誰かがそれらを役立つと思うでしょう!

1. シンボリック関数または点集合はありますか?

  • シンボリック関数がある場合は、導関数を解析的に計算できる場合があります。(おそらく、これがそれほど簡単であれば、あなたはこれを行ったでしょう。そして、ここで代替案を探しているわけではないでしょう.)
  • シンボリック関数があり、導関数を解析的に計算できない場合は、いつでも点の集合で関数を評価し、このページにリストされている他の方法を使用して導関数を評価できます。
  • ほとんどの場合、一連の点 (xi,fi) があり、次のいずれかの方法を使用する必要があります....

2. グリッドの間隔は均等ですか、それとも不均等ですか?

  • グリッドが等間隔である場合は、周期境界条件 (以下を参照) を使用していない限り、おそらく有限差分スキームを使用することをお勧めします (ウィキペディアのこちらまたはこちらの記事を参照)。これは、グリッド上の常微分方程式を解くという文脈での有限差分法の適切な紹介です (特にスライド 9 ~ 14 を参照)。これらの方法は、一般に計算効率が高く、実装が簡単で、方法の誤差は、導出に使用されたテイラー展開の打ち切り誤差として簡単に見積もることができます。
  • グリッドの間隔が不均一な場合でも有限差分スキームを使用できますが、式はより難しくなり、精度はグリッドの均一性によって大きく異なります。グリッドが非常に不均一な場合は、特定の点で導関数を計算するために、大きなステンシル サイズ (より多くの隣接点) を使用する必要があります。多くの場合、補間多項式 (多くの場合ラグランジュ多項式) を作成し、その多項式を微分して導関数を計算します。たとえば、このStackExchange の質問を参照してください。これらの方法を使用して誤差を推定することは、しばしば困難です (ただし、そうしようとしたものもあります:ここおよびここ)。フォーンバーグ法多くの場合、これらの場合に非常に役立ちます。
  • ステンシルにはドメイン外のポイントが含まれることが多いため、ドメインの境界には注意が必要です。「ゴースト ポイント」を導入したり、境界条件をさまざまな次数の導関数と組み合わせて、これらの「ゴースト ポイント」を排除し、ステンシルを単純化する人もいます。もう 1 つのアプローチは、右側または左側の有限差分法を使用することです。
  • これは、低次の中央、右側、および左側のスキームを含む、有限差分法の優れた「チートシート」です。とても便利なので、ワークステーションの近くにこれを印刷して保管しています。

3. ドメインは定期的ですか? 周期境界条件を仮定できますか?

  • ドメインが周期的である場合、フーリエ スペクトル法を使用して非常に高い精度で微分を計算できます。この手法は、精度を高めるためにパフォーマンスをいくらか犠牲にします。実際、N 点を使用している場合、導関数の推定値はおよそ N^ 次の精度になります。詳細については、(たとえば)この WikiBookを参照してください。
  • フーリエ法では、単純に実装された離散フーリエ変換 (DFT) が採用する可能性のある O(N^2) アルゴリズムではなく、高速フーリエ変換 (FFT) アルゴリズムを使用して、おおよそ O(N log(N)) パフォーマンスを達成することがよくあります。
  • 関数と定義域が周期的でない場合は、フーリエ スペクトル法を使用しないでください。周期的でない関数で使用しようとすると、大きなエラーと望ましくない「リンギング」現象が発生します。
  • 任意の次数の導関数を計算するには、1) グリッド空間からスペクトル空間への変換 (O(N log(N)))、2) フーリエ係数とスペクトル波数の乗算 (O(N))、および 2) が必要です。スペクトル空間からグリッド空間への逆変換 (再び O(N log(N)))。
  • フーリエ係数にスペクトル波数を掛けるときは注意が必要です。FFT アルゴリズムのすべての実装には、スペクトル モードと正規化パラメーターの独自の順序があるようです。たとえば、MATLAB でこれを行う場合の注意事項については、Math StackExchange のこの質問への回答を参照してください。

4. どのレベルの精度を求めていますか? 与えられた許容範囲内で導関数を計算する必要がありますか?

  • 多くの場合、1 次または 2 次の有限差分スキームで十分です。精度を高めるには、高次のテイラー展開を使用して、高次の項を削除できます。
  • 与えられた許容範囲内で導関数を計算する必要がある場合は、必要な誤差を持つ高次スキームを探し回る必要があるかもしれません。
  • 多くの場合、エラーを減らす最善の方法は、有限差分スキームでグリッド間隔を減らすことですが、これが常に可能であるとは限りません。
  • 高次の有限差分スキームでは、ほとんどの場合、より大きなステンシル サイズ (より多くの隣接点) が必要になることに注意してください。これにより、境界で問題が発生する可能性があります。(ゴースト ポイントについては、上記の説明を参照してください。)

5.関数が定義されているのと同じ点で導関数が評価されることは重要ですか?

  • MATLAB は、diff隣接する配列要素間の差を計算する関数を提供します。これは、1 次前方差分 (または前方有限差分) スキームを介して近似導関数を計算するために使用できますが、推定値は低次推定値です。MATLAB のドキュメントdiff(リンク) で説明されているように、長さ N の配列を入力すると、長さ N-1 の配列が返されます。この方法を使用して N ポイントで導関数を推定すると、N-1 ポイントでの導関数の推定しか得られません。(これは、昇順でソートされている場合、不均等なグリッドで使用できることに注意してください。)
  • diffほとんどの場合、すべての点で導関数を評価する必要があります。つまり、メソッド以外に何かを使用したいということです。

6. 複数のデリバティブ注文を計算する必要がありますか?

  • 格子点関数値とこれらの点での 1 次および 2 次導関数がすべて互いに依存する連立方程式を設定できます。これは、通常のように隣接する点でテイラー展開を組み合わせることによって見つけることができますが、微分項をキャンセルするのではなく保持し、それらを隣接する点のそれらとリンクします。これらの方程式は、線形代数を介して解くことができ、1 次導関数だけでなく、2 次導関数 (適切に設定されている場合はより高い次数) も得られます。これらは複合有限差分スキームと呼ばれ、次に説明するコンパクトな有限差分スキームと組み合わせて使用​​されることが多いと思います。
  • コンパクトな有限差分スキーム (リンク)。これらのスキームでは、計画行列を設定し、行列解を介してすべての点で導関数を同時に計算します。それらは通常、同等の精度の通常の有限差分スキームよりも少ないステンシル ポイントを必要とするように設計されているため、"コンパクト" と呼ばれます。それらはすべての点を結び付ける行列方程式を含むため、特定のコンパクトな有限差分スキームは「スペクトルのような解像度」を持つと言われています (たとえば、Lele の 1992 年の論文--優れた!)、つまり、すべてのノード値に依存することでスペクトル スキームを模倣し、このため、すべての長さスケールで精度を維持します。対照的に、典型的な有限差分法は局所的にのみ正確です (たとえば、ポイント #13 の導関数は通常、ポイント #200 の関数値に依存しません)。
  • 現在の研究分野は、コンパクトなステンシルで複数の微分をどのように解決するのが最善かということです。多くの研究者は、特定のニーズ (パフォーマンス、精度、安定性、または流体力学などの特定の研究分野) に合わせて調整する傾向がありますが、このような研究の結果、結合されたコンパクトな有限差分法は強力であり、広く適用できます。

すぐに使えるルーチン

  • 上記のように、diff関数(ドキュメントへのリンク)を使用して、隣接する配列要素間で粗い導関数を計算できます。
  • MATLAB のgradientルーチン (ドキュメントへのリンク) は、多くの目的に最適なオプションです。これは、二次中心差分スキームを実装します。これには、多次元で導関数を計算し、任意のグリッド間隔をサポートするという利点があります。(この明らかな省略を指摘してくれた @thewaywewalk に感謝します!)

  • Fornberg の方法 (上記参照) を使用してnderiv_fornberg、任意のグリッド間隔について 1 次元の有限差分を計算する小さなルーチン ( ) を開発しました。使いやすいと思います。境界で 6 ポイントの側面ステンシルを使用し、内部で中央の 5 ポイント ステンシルを使用します。これは、MATLAB File Exchange で入手できます

結論

数値分化のフィールドは非常に多様です。上記の各メソッドには、独自の利点と短所のセットを備えた多くのバリエーションがあります。この投稿は、数値分化の完全な処理ではありません。

すべてのアプリケーションは異なります。この投稿が、興味のある読者に、自分のニーズに合った方法を選択するための考慮事項とリソースの整理されたリストを提供することを願っています.

このコミュニティ wiki は、MATLAB に固有のコード スニペットと例で改善される可能性があります。

于 2015-04-06T20:09:10.230 に答える
2

これらの特定の質問にはもっと多くのことがあると思います。そこで、この件について次のように詳しく説明しました。

(4) Q: どの程度の精度を求めていますか? 与えられた許容範囲内で導関数を計算する必要がありますか?

A: 数値微分の精度は、関心のあるアプリケーションに対して主観的です。通常、順方向問題で ND を使用して導関数を近似し、目的の信号から特徴を推定する場合は、ノイズ摂動に注意する必要があります。通常、このようなアーティファクトには高周波成分が含まれており、微分器の定義により、ノイズ効果は $i\omega^n$ の大きさのオーダーで増幅されます。したがって、微分器の精度を上げる (多項式の精度を上げる) ことはまったく役に立ちません。この場合、微分のためにノイズの影響をキャンセルできるはずです。これはケースケードの順序で行うことができます: 最初に信号を平滑化し、次に微分します。しかし、これを行うより良い方法は、「ローパス微分器」を使用することです。ここに

ただし、これが当てはまらず、偏微分方程式の解法などの逆問題で ND を使用している場合、微分器の全体的な精度が非常に重要になります。問題に適した境界条件 (BC) の種類に応じて、それに応じて設計が調整されます。強打の法則は、フルバンド微分器として知られている数値精度を上げることです。適切な BC を処理する導関数行列を設計する必要があります。上記のリンクを使用して、そのような設計に対する包括的なソリューションを見つけることができます。

(5) 関数が定義されているのと同じ点で導関数が評価されることは、あなたにとって重要ですか? A: はい、もちろんです。同じグリッド ポイントでの ND の評価は「集中」スキームと呼ばれ、ポイントから離れた「スタガード」スキームと呼ばれます。導関数の奇数次数を使用すると、集中 ND は微分器の周波数応答の精度を逸脱することに注意してください。したがって、逆問題でそのような設計を使用している場合、これは近似を混乱させます。また、逆のことが、時差スキームによって利用される微分順序が偶数の場合にも当てはまります。上記のリンクを使用して、この件に関する包括的な説明を見つけることができます。

(6) デリバティブの複数のオーダーを計算する必要がありますか? これは、手元のアプリケーションに完全に依存します。私が提供したのと同じリンクを参照して、複数の派生デザインを処理できます。

于 2017-09-05T17:27:16.967 に答える