(注:これはコミュニティーWikiを対象としています。)
ポイントのセットがあるとしますxi= {x0、x1、x2 ,... xn}および対応する関数値fi= f(xi {f0、f1、f2 ,..., fn}、ここでf(x)は、一般に、未知の関数です。)==(状況によっては、f(x)は前もって行われますが、わからない知っているf(x)事前に知っておいてください。) 各点でf(x)の導関数を近似する良い方法は何ですかxi?つまり、dfi== d/dxfi== df(xi)/ dx各ポイントでxi?
残念ながら、MATLABには非常に優れた汎用の数値微分ルーチンがありません。これの理由の1つは、適切なルーチンを選択することが難しい場合があるためです。
それでは、どのような方法がありますか?どのようなルーチンが存在しますか?特定の問題に適したルーチンをどのように選択できますか?
MATLABで区別する方法を選択する場合、いくつかの考慮事項があります:
続行するには最良の方法は何ですか?
これらはほんの一部の簡単で汚い提案です。うまくいけば、誰かがそれらを参考にしてくれるでしょう!
1。シンボリック関数またはポイントのセットはありますか?
2。グリッドは等間隔か不等間隔ですか?
3。ドメインは定期的ですか?周期的な境界条件を想定できますか?
4。どのレベルの精度を求めていますか?与えられた許容範囲内で導関数を計算する必要がありますか?
5。関数が定義されているのと同じ点で導関数が評価されることは重要ですか?
diff
関数が用意されています。これは、一次の前方微分(または前方有限差分)スキームを介して近似導関数を計算するために使用できますが、推定は低次推定です。 diff
( link )に関するMATLABのドキュメントで説明されているように、長さNの配列を入力すると、長さN-1の配列が返されます。この方法を使用してNポイントで導関数を推定すると、N-1ポイントでのみ導関数の推定値が得られます。 (昇順でソートされている場合、これは不均一なグリッドで使用できることに注意してください。)diff
メソッド以外のものを使用したいということです。6。導関数の複数の次数を計算する必要がありますか?
すぐに使えるルーチン
diff
関数( link からドキュメントへ)を使用して、隣接する配列要素間の大まかな微分を計算できます。MATLABのgradient
ルーチン( link からドキュメントへ)は、多くの目的に最適なオプションです。 2次の中央差分スキームを実装します。複数の次元で導関数を計算し、任意のグリッド間隔をサポートするという利点があります。 (この明白な省略を指摘してくれた@thewaywewalkに感謝!)
私はFornbergの方法(上記を参照)を使用して小さなルーチン(nderiv_fornberg
)任意のグリッド間隔で1次元の有限差分を計算します。使いやすいと思います。境界には6ポイントの両面ステンシルを使用し、内部には中央に5ポイントのステンシルを使用します。これは、MATLAB File Exchange here で入手できます。
結論
数値微分の分野は非常に多様です。上記の方法ごとに、独自の利点と欠点のセットを持つ多くのバリアントがあります。この投稿は、数値微分の完全な扱いではありません。
アプリケーションはそれぞれ異なります。うまくいけば、この投稿が興味のある読者に、自分のニーズに合った方法を選択するための考慮事項とリソースの整理されたリストを提供します。
このコミュニティWikiは、MATLABに固有のコードスニペットと例で改善される可能性があります。
私はこれらの特定の質問にもっとあると思います。したがって、私はこの主題について次のようにさらに詳しく説明しました:
(4)Q:どのレベルの精度を求めていますか?与えられた許容範囲内で導関数を計算する必要がありますか?
A:数値微分の精度は、対象のアプリケーションにとって主観的です。通常、それが機能する方法は、NDインフォワード問題を使用して導関数を近似し、対象の信号から特徴を推定する場合、ノイズの摂動に注意する必要があります。通常、このようなアーチファクトには高周波成分が含まれており、微分器の定義により、ノイズ効果は$ i\omega ^ n $の大きさで増幅されます。したがって、微分器の精度を上げる(多項式の精度を上げる)ことはまったく役に立ちません。この場合、微分のノイズの影響をキャンセルできるはずです。これは、ケースケードの順序で実行できます。最初に信号を平滑化してから、微分します。しかし、これを行うより良い方法は、「ローパス微分器」を使用することです。 MATLABライブラリの良い例は here です。
ただし、これが当てはまらず、ソルベントPDEなどの逆問題でNDを使用している場合、微分器のグローバルな精度は非常に重要です。どのブナディ条件(BC)が問題に適しているかによって、設計はそれに応じて適応されます。サンプのルールは、既知の数値精度を高めることで、フルバンド微分器です。適切なBCを処理する微分行列を設計する必要があります。上記のリンクを使用して、このような設計に対する包括的なソリューションを見つけることができます。
(5)導関数が関数の定義と同じ点で評価されることは重要ですか?A:はい、絶対にあります。同じグリッドポイントでのNDの評価は「集中型」と呼ばれ、ポイントを外れた「交互配置」スキームと呼ばれます。奇数次の導関数を使用すると、集中NDは微分器の周波数応答の精度を逸脱することに注意してください。したがって、そのような設計を逆問題で使用している場合、これは近似を混乱させます。また、逆のことは、スタガードスキームで利用される微分の偶数次数の場合にも当てはまります。上記のリンクを使用して、このテーマに関する包括的な説明を見つけることができます。
(6)導関数の複数の次数を計算する必要がありますか?これは、手元のアプリケーションに完全に依存します。私が提供した同じリンクを参照して、複数の派生デザインを処理できます。