浮動小数点演算で、小さな用語を大きな用語の差に追加すると、数値の不正確さが生じるのはなぜですか?


13

私は、アレンとティルデスリーによる「液体のコンピューターシミュレーション」という本を読んでいます。71ページ以降、著者は分子動力学(MD)シミュレーションでニュートンの運動方程式を統合するために使用されるさまざまなアルゴリズムについて説明します。78ページから、著者はVerletアルゴリズムについて議論します。これはおそらくMDの標準的な統合アルゴリズムです。彼らは述べています:

おそらく、運動方程式を統合する最も広く使用されている方法は、Verlet(1967)によって最初に採用され、Stormer(Gear 1971)に起因するものです。この方法は、二次方程式の直接解であるmir¨i=fi。方法はpostionsに基づいてr(t)、加速度a tで、そして位置rをT - δ T 前のステップから。位置を進める方程式は次のようになります。a(t)r(tδt)

(3.14)r(t+δt)=2r(t)r(tδt)+δt2a(t).

eqn(3.14)について注意すべき点がいくつかあります。速度がまったく表示されないことがわかります。についてテイラー展開によって得られた方程式を追加することにより、それらは削除されました。r(t)

r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...

(3.15)r(tδt)=r(t)δtv(t)+(1/2)δt2a(t)....

次に、後で(80ページ)、著者は次のように述べています。

Verletアルゴリズムに対して、...アルゴリズムの形式は、不必要に数値の不正確さをもたらす可能性があります。これが発生する、ためEQN(3.14)、小用語(IN )大用語の差に加算され(OO(δt2)の軌道を生成する)、順序。 O(δt0)

私は"小用語"であることを推測、及び"大用語の違いが" 2 、RT - Rδt2a(t)2r(t)r(tδt)

私の質問は、大きな用語の違いに小さな用語を追加すると、なぜ数値の不正確さが生じるのかということです。

浮動小数点演算の詳細にまったく精通していないため、かなり基本的な概念上の理由に興味があります。また、この質問に関連する浮動小数点演算の基本的な考え方を紹介する「概要タイプ」の参照(書籍、記事、またはWebサイト)を知っていますか?御時間ありがとうございます。

回答:


9

彼らの観察「アルゴリズムの形式は不必要に数値の不正確さを導入するかもしれない」は正しい。EQN(3.14)、小用語に(のでそれらの説明は'これが生じ)(大用語の差に加算されるO δ T 0O(δt2)O(δt0)軌道を生成するために、)。 ''は偽物です。

Verletのアルゴリズムのわずかな数値不安定性の真の理由は、差分方程式(本質的にVerletでaを無視する場合)に寄生があるため、わずかに安定していることです解はkに比例し、導入された誤差はkで線形に増加しますが、散逸微分方程式に適用された完全に安定したマルチステップ法では、誤差の成長は制限されます。xk+1=2xkxk1akk

編集:本は、分子動力学の数値シミュレーションについて、得られた期待の妥当な精度を得るための一つは、膨大な数の必要があることを注意と精度スケールとして、工程をO N - 1 / 2のみ。(多くの場合、時間ステップは、固有振動スケールに従うことピコ秒である。しかし、生物学的に関連する時間スケールは、ミリ秒以上(であるN 10 9通常、1つは、そこまでを計算しませんが、)。)NO(N1/2)N109

詳細については、http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergenceを参照して ください


10

良い紹介を探しているなら、デビッド・ゴールドバーグの「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」をお勧めします。少し詳細すぎるかもしれませんが、無料でオンラインで入手できます。

優れたライブラリをお持ちの場合は、Michael OvertonのIEEE浮動小数点演算による数値計算、またはNick Highamの精度と数値アルゴリズムの安定性の最初の数章をお勧めします。

アレンとティルデスリーが具体的に言及しているのは、数値キャンセルです。つまり、たとえば3桁しかない場合に100から減算すると1011.00(3桁)になります。数字は3桁まで正確であるように見えますが、実際には、最初の桁のみが真であり、末尾.00はゴミです。どうして?まあ、100101だけ言って、の不正確な表現である100.12345101.4321、しかし、あなたは唯一の3桁の数字としてそれらを格納することができます。


-1:Verlet式に起因するキャンセルはどこにありますか?典型的には、作るれ、小さいR \ T - δ T R T )を、キャンセルが得られないと。r t = 1を試してください!δtr(\tδt)r(t)r(t)=1
アーノルドノイマイアー

@ArnoldNeumaier:はい、アレンとティルデスリーの例はあまり意味をなさないようです。「小さな用語[..]が大きな用語の違いに追加される」場合に発生する問題の参照を提供したかっただけです。 OPは、特定のケースで問題かどうかではなく、尋ねました。
ペドロ

しかし、小さな用語を大きな用語に追加することは、単なる丸め誤差であり、まったく危険ではありません。キャンセルとは、2つのほぼ等しい大きな用語を差し引いて小さな用語を取得することです。これは、減算された中間体が計算の最終結果よりはるかに大きい場合、またはキャンセルの影響を受ける小さな中間結果が別の小さな要素で除算される場合にのみ問題になります。
アーノルドノイマイアー

@ArnoldNeumaier:私の答えから明らかなように、合計ではなく差を計算する問題に言及していました。
ペドロ

1
@ArnoldNeumaier:重要な点ですが、 "-1"についてはささいなことだと思うことを理解してほしい。
ペドロ

5

(3.14)

r(t)=101
r(tδt)=100
δt2a(t)=1.49

(3.14)

r(t+δt)=103.49

ただし、3桁しか使用できないため、結果は切り捨てられます

r(t+δt)=103

a(t)r(t+20δt)=331433.90


しかし、その効果は3桁の10進数演算でのみ大きくなります。
アーノルドノイマイアー

3

ペドロはすでに重要な事実、すなわちキャンセルを提供しています。ポイントは、計算するすべての数値に関連する精度があることです。たとえば、単精度の浮動小数点数では、最大約8桁の精度しか表現できません。2つの数値がほぼ同じで、7桁目が異なる場合、その差は8桁の単精度浮動小数点数になり、8桁まで正確であるように見えますが、実際は最初の数値のみです1桁または2桁は、計算した数量がこの最初の1桁または2桁の差を超えて正確ではないため、正確です。

今、あなたが引用した本は1989年のものです。当時、計算はほとんどの場合単精度で行われ、丸めとキャンセルは重大な問題でした。今日、ほとんどの計算は16桁の精度の倍精度を使用して行われていますが、これは以前ほど問題になりません。あなたが引用した段落を一粒の塩で読んで、それらの時間の文脈でそれらを取ることは価値があると思います。


倍精度演算のキャンセルは、単精度の場合と同じくらい大きな問題になる可能性があります。適切な例は、ピボットなしのガウス消去です。これは、倍精度であっても、キャンセルのために非常に悪い結果になることがよくあります。
アーノルドノイマイアー

-1:Verletの式は通常、単精度で8分の1または2ではなく、すべての桁の精度を保持します。
アーノルドノイマイアー

@ArnoldNeumaier:もちろん、同じ種類の問題を倍精度で得ることができます。私が言ったのは、それほど頻繁に遭遇しないということです。
ウルフギャングバンガース

一連の計算で6桁を3回失うと、倍精度であってもすべての桁が失われます。キャンセルに悩まされるアルゴリズムは、通常、倍精度でも不十分です。Verletのアルゴリズムは異なります。キャンセルはなく、エラーが緩やかに線形に増加するためです。したがって、精度の損失は増加せず、はるかに長い積分時間に適しています。これはアレンとティルデスリーに確実に知られていました。
アーノルドノイマイアー

正しい。しかし、私が意味するのは、キャンセルのないアルゴリズムがある場合、単精度で1e-8のオーダーでエラーが発生し、1e8タイムステップを実行すると、他のすべてが正確であっても問題が発生する可能性があるということです。1e8のタイムステップは、ODEの場合の桁違いです。一方、倍精度では、各ステップの不正確さは1e-16であり、完全な精度の損失を得るには1e16時間ステップが必要です。これは、実際に発生しない多くの手順です。
ウルフギャングバンガース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.