Dalam aritmatika floating point, mengapa ketidaktepatan numerik dihasilkan dari penambahan istilah kecil ke perbedaan istilah besar?

13

Saya telah membaca buku Computer Simulation of Liquids oleh Allen dan Tildesley. Mulai dari halaman 71, penulis membahas berbagai algoritma yang digunakan untuk mengintegrasikan persamaan gerak Newton dalam simulasi dinamika molekul (MD). Mulai dari halaman 78, penulis membahas algoritma Verlet, yang mungkin merupakan algoritma integrasi kanonik dalam MD. Mereka menyatakan:

Mungkin metode yang paling banyak digunakan untuk mengintegrasikan persamaan gerak adalah yang awalnya diadopsi oleh Verlet (1967) dan dikaitkan dengan Stormer (Gear 1971). Metode ini adalah solusi langsung dari persamaan orde kedua . Metode ini didasarkan pada posisi r ( t ) , akselerasi a ( t ) , dan posisi r ( t - δ t ) dari langkah sebelumnya. Persamaan untuk memajukan posisi berbunyi sebagai berikut:mir¨i=fir(t)a(t)r(tδt)

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

Ada beberapa poin yang perlu diperhatikan tentang eqn (3.14). Akan terlihat bahwa kecepatan tidak muncul sama sekali. Mereka telah dieliminasi dengan penambahan persamaan yang diperoleh oleh ekspansi Taylor tentang :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)....

Kemudian, nanti (di halaman 80), penulis menyatakan:

Melawan algoritme Verlet, ... bentuk algoritme mungkin tidak perlu memperkenalkan beberapa ketidaktepatan numerik. Ini muncul karena, dalam persamaan (3.14), istilah kecil ( ) ditambahkan ke perbedaan istilah besar ( O ( δ t 0 )O(δt2)O(δt0) ), untuk menghasilkan lintasan.

Saya kira "istilah kecil" adalah , dan "perbedaan istilah besar" adalah 2 r ( t ) - r ( t - δ t )δt2a(t)2r(t)r(tδt) .

Pertanyaan saya adalah, mengapa hasil angka tidak tepat dari menambahkan istilah kecil ke perbedaan istilah besar?

Saya tertarik pada alasan konseptual yang agak mendasar, karena saya sama sekali tidak terbiasa dengan detail aritmatika floating point. Juga, apakah Anda tahu referensi "tipe ikhtisar" (buku, artikel, atau situs web) yang akan memperkenalkan saya pada ide dasar aritmatika titik apung yang terkait dengan pertanyaan ini? Terima kasih atas waktunya.

Andrew
sumber

Jawaban:

9

Pengamatan mereka '' bentuk algoritma mungkin perlu memperkenalkan beberapa ketidaktepatan numerik '' benar. Tetapi penjelasan mereka '' Ini muncul karena, dalam persamaan (3.14), istilah kecil ( ) ditambahkan ke perbedaan istilah besar ( O ( δ t 0 ) ), untuk menghasilkan lintasan. '' Adalah palsu.O(δt2)O(δt0)

Alasan sebenarnya untuk sedikit ketidakstabilan numerik dari algoritma Verlet adalah bahwa itu hanya sedikit stabil, karena persamaan perbedaan (pada dasarnya kasus di mana Anda mengabaikan a di Verlet) memiliki parasit solusi proporsional dengan k , yang menyebabkan kesalahan diperkenalkan untuk tumbuh secara linear dalam kxk+1=2xkxk1akk sedangkan untuk metode multistep yang sepenuhnya stabil diterapkan pada persamaan diferensial disipatif, pertumbuhan kesalahan dibatasi.

Edit: Perhatikan bahwa buku ini adalah tentang simulasi numerik dari dinamika molekul, dan untuk mendapatkan akurasi yang wajar dari harapan yang dihasilkan salah satu kebutuhan sejumlah besar langkah, seperti timbangan akurasi dengan O ( N - 1 / 2 ) saja. (Seringkali langkah waktu dalam picosecond untuk mengikuti skala osilasi intrinsik. Tetapi skala waktu yang relevan secara biologis berada dalam milidetik atau lebih besar ( N 10 9 ), meskipun biasanya seseorang tidak menghitung sejauh itu.)NO(N1/2)N109

Untuk detail lebih lanjut, lihat http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence

Arnold Neumaier
sumber
10

Jika Anda mencari pengantar yang baik, saya akan menyarankan David Goldberg tentang Apa yang Setiap Ilmuwan Harus Tahu Tentang Aritmatika Floating Point . Mungkin agak terlalu rinci, tetapi tersedia online secara gratis.

Jika Anda memiliki perpustakaan yang baik, saya sarankan Numerical Computing Michael Overton dengan IEEE Floating Point Arithmetic , atau beberapa bab pertama dari Akurasi dan Stabilitas Nick Algoritma Numerik Nick Higham .

Yang dimaksud Allen dan Tildesley secara spesifik adalah Pembatalan numerik . Pendek itu adalah bahwa jika Anda memiliki, katakanlah, hanya tiga digit dan kurangi 100dari 101, Anda mendapatkan 1.00(tiga digit). Jumlahnya kelihatannya akurat hingga tiga digit, tetapi sebenarnya, hanya angka pertama yang benar dan jejaknya .00adalah sampah. Mengapa? Ya, 100dan 101hanya representasi tidak tepat dari, katakan 100.12345dan 101.4321, tetapi Anda hanya bisa menyimpannya sebagai angka tiga digit.

Pedro
sumber
-1: Di mana pembatalan yang Anda atributkan ke rumus Verlet? Khasδt kecil, yang membuatnya r(\ t-δt)r(t), tanpa pembatalan. Mencobar(t)=1!
Arnold Neumaier
@ArnoldNeumaier: Ya, contoh Allen dan Tildesley tampaknya tidak masuk akal, saya hanya ingin memberikan beberapa referensi untuk masalah yang muncul ketika "istilah kecil [..] ditambahkan ke perbedaan istilah besar", yang adalah apa OP bertanya, bukan apakah itu masalah dalam kasus yang diberikan.
Pedro
Tetapi menambahkan istilah kecil ke istilah besar hanyalah kesalahan pembulatan, tidak ada bahaya sama sekali. Pembatalan adalah ketika dua istilah besar yang hampir sama dikurangi untuk mendapatkan istilah kecil. Ini menjadi masalah hanya ketika perantara yang dikurangkan jauh lebih besar dari hasil akhir perhitungan, atau ketika hasil antara kecil yang dipengaruhi oleh pembatalan dibagi oleh elemen kecil lainnya.
Arnold Neumaier
@ArnoldNeumaier: Seperti, saya pikir, cukup jelas dari jawaban saya, saya merujuk pada masalah menghitung perbedaan, bukan jumlahnya.
Pedro
1
@ArnoldNeumaier: Point taken, but I hope you understand that I consider that quite petty for a "-1".
Pedro
5

To apply Pedro's example to the equation (3.14), assume your variables are stored with the following values:

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

From (3.14) it should follow that

r(t+δt)=103.49

but, since we can only use three digits, the result becomes truncated to

r(t+δt)=103

This error will propagate, so that after 20 steps, assuming a(t) remains unchanged, you get r(t+20δt)=331 instead of 433.90,

Igor F.
sumber
But the effect is that large only in 3-digit decimal arithmetic.
Arnold Neumaier
3

Pedro already gives the important fact, namely cancellation. The point is that every number you compute with has an associated accuracy; for example, a single precision floating point number can only represent things up to approximately 8 digits of accuracy. If you have two numbers that are almost exactly the same but differ in the 7th digit, then the difference will again be an 8-digit single precision floating point number and it looks like it is accurate to 8 digits, but in reality only the first 1 or 2 digits are accurate because the quantities you computed it from are not accurate beyond this first 1 or 2 digits of the difference.

Sekarang, buku yang Anda kutip adalah dari 1989. Saat itu, perhitungan paling sering dilakukan dalam satu ketepatan dan pembulatan dan pembatalan adalah masalah serius. Saat ini, sebagian besar perhitungan dilakukan dengan menggunakan presisi ganda dengan 16 digit akurasi, dan ini jauh lebih sedikit masalah saat ini daripada sebelumnya. Saya pikir ada baiknya membaca paragraf yang Anda kutip dengan sebutir garam dan mengambilnya dalam konteks waktu mereka.

Wolfgang Bangerth
sumber
cancellation in double precision arithmetic can be as big a problem as in single precision. A case in point is Gaussian elimination without pivoting, which often gives very poor results due to cancellation, even in double precision.
Arnold Neumaier
-1: The Verlet formula typically retains all digits of accuracy, not just 1 or 2 of 8 in single precision.
Arnold Neumaier
@ArnoldNeumaier: Sure, you can get the same kind of problems in double precision. All I said is that one doesn't encounter them quite as frequently.
Wolfgang Bangerth
If you lose 6 digits three times in a chain of computations you have lost all digits even in double precision. Algorithms suffering from cancellation will usually be poor even in double precision. Verlet's algorithm is different since there is no cancellation but a mild linear growth of errors. Thus the loss of accuracy cannot multiply, making it suitable for much longer integration times. This was surely known to Allen & Tildesley.
Arnold Neumaier
Baik. Tapi yang saya maksudkan adalah bahwa jika Anda memiliki algoritma tanpa pembatalan, Anda masih mengalami kesalahan pada urutan 1e-8 dalam presisi tunggal, dan jika Anda melakukan langkah waktu 1e8 maka Anda mungkin memiliki masalah bahkan jika semuanya tepat. Langkah waktu 1e8 adalah urutan besarnya yang Anda miliki untuk ODE. Di sisi lain, dalam presisi ganda, ketidakakuratan Anda dalam setiap langkah adalah 1e-16 dan akan membutuhkan langkah waktu 1e16 untuk mendapatkan kehilangan akurasi sepenuhnya. Itu adalah sejumlah langkah yang tidak akan Anda temui dalam latihan.
Wolfgang Bangerth