Bagaimana cara mengidentifikasi perhitungan floating point yang tidak stabil?

15

Dalam numerik, sangat penting untuk dapat mengidentifikasi skema yang tidak stabil dan meningkatkan stabilitasnya. Bagaimana cara mengidentifikasi perhitungan floating point yang tidak stabil?

Saya sedang mengerjakan simulasi yang sangat kompleks di mana banyak skema numerik bekerja bersama dan saya mencari metode untuk mengidentifikasi bagian-bagian yang lemah. Saya sedang mengerjakan model fisik yang melibatkan persamaan diferensial. Pandangan mata burung dari keseluruhan proses adalah:

  1. (Langkah awal) Kumpulkan pengamatan fisik P .

  2. Tentukan parameter awal simulasi. Ini menggunakan algoritma pengoptimalan, di mana kita berjalan di ruang parameter dan mencari parameter C sedemikian sehingga beberapa fungsi kesalahan E (F (C), P) diminimalkan, di mana F adalah beberapa kuantitas yang diturunkan dari parameter.

  3. Pasang C di mesin simulasi. Ini adalah skema Euler dari EDP, sehingga pada setiap langkah waktu, kami menghitung istilah yang menggerakkan dinamika (masing-masingnya adalah fungsi kompleks, berpotensi tunduk pada ketidakstabilan) dan memberi makan skema Euler dengan istilah dinamis ini untuk menghitung selanjutnya negara. Ini berlangsung selama ribuan poin waktu.

  4. Pada akhir simulasi, kami menghitung beberapa fungsi Proof (S) dari keadaan akhir S dan membandingkan dengan beberapa jumlah yang diperlukan (P) yang disimpulkan dari jumlah yang diamati. Ini bukan bukti formal dari hasilnya, lebih merupakan pemeriksaan yang masuk akal.

Juga, saya melihat menara operasi yang kompleks (perhitungan istilah dinamis, dalam skema Euler, dalam Bukti ). Dan ingin mengenali "bagian buruk" dan memperbaikinya.

Saya berspekulasi bahwa menggunakan implementasi perangkat lunak angka floating point dengan presisi berkurang akan memperbesar ketidakstabilan skema numerik, sehingga memudahkan perbandingan antara implementasi yang berbeda. Apakah ini teknik umum untuk menyelidiki pertanyaan ini? Apakah mungkin menggunakan mesin virtual, seperti Bochs, untuk mencapai ini tanpa mengubah program?

Untuk menangani pertanyaan stabilitas dengan tepat, kadang-kadang dapat diterima untuk menargetkan input tipikal dari prosedur numerik, sehingga dapat disesuaikan untuk melakukannya dengan baik pada input tersebut dan mungkin kurang baik pada input lain yang valid, namun tidak mungkin. Diberikan sampel input tipikal, dimungkinkan untuk mengintip beberapa hasil antara dan menyiapkan profil statistik untuk mereka. Sekali lagi, apakah ini teknik umum untuk mempelajari masalah stabilitas? Apakah mesin virtual bermanfaat untuk ini?

pengguna40989
sumber
mungkin Anda akan memiliki jawaban yang lebih menarik di math.stackexchange.com
Simon Bergot
@Simon Anda mungkin benar, tetapi ini jelas merupakan pertanyaan lintas domain. Saya kira orang-orang yang bisa menjawab apakah terdaftar pada matematika dan programmer atau tidak sama sekali ... Mari kita tunggu sebentar untuk melihat apakah pertanyaan ini menemukan jawabannya di sini!
user40989
1
Aritmatika interval?
SK-logic
2
Menggunakan Euler untuk menyebarkan negara tidak harus jahat; tidak ada optimasi, tetapi Anda benar-benar harus membagi masalah menjadi subtugas. Ketidakstabilan numerik mungkin yang paling menyengsarakan Anda - konvergensi ke nilai maksimum yang salah dan masalah yang terkait dengan kekakuan ODE / PDE tampak lebih besar dari itu. Dan ya, tidak pernah menggunakan presisi tunggal :)
Deer Hunter

Jawaban:

6

Studi stabilitas perhitungan floating point adalah bagian dari analisis numerik dan jika Anda benar-benar menginginkan hasil yang baik, Anda benar-benar ingin seseorang yang berpengetahuan luas dalam domain itu untuk melakukan analisis algoritma yang digunakan.

Ada beberapa hal yang dapat membantu secara eksperimental mengidentifikasi algoritma yang tidak stabil. Berjalan dengan pembulatan diatur ke mode yang berbeda (atas / bawah / acak) atau dengan presisi berbeda dan memeriksa bahwa hasilnya tidak terlalu berbeda. Menjawab apakah ini terlalu banyak? sama sekali tidak sederhana dan bahkan ketika jawabannya adalah tidak , itu tidak berarti bahwa algoritma itu stabil, hanya saja itu tidak terdeteksi tidak stabil pada set data yang Anda gunakan.

Aritmatika interval telah diusulkan dalam komentar. Ketika saya melihatnya, bahkan pendukung aritmatika interval yang paling fanatik mengakui bahwa itu bekerja dengan baik dengan algoritma yang dirancang untuk aritmatika interval tetapi beralih ke itu tanpa menganalisis algoritma dan memastikan bahwa itu tidak diketahui pola tidak bekerja dengan baik tidak akan berguna (lawan tampaknya berpendapat bahwa pra-kondisi untuk aritmatika interval berguna jika terlalu membatasi untuk kepentingan praktis)

Pemrogram
sumber
3

Merancang algoritma floating point yang stabil sangat tidak trivial. Mereka yang lebih ahli secara matematis daripada saya menyarankan menggunakan perpustakaan yang dianggap baik di mana mungkin daripada mencoba untuk menggulir perpustakaan Anda sendiri. Referensi standar di area tersebut tampaknya adalah:

NJ Higham. Keakuratan dan Stabilitas Algoritma Numerik. Masyarakat untuk Matematika Industri dan Terapan, Philadelphia, PA, AS, edisi kedua, 2002. ISBN 0-89871-521-0

Tidak tahu lebih banyak tentang jenis komputasi, bahasa, dll. Apa yang membuat sulit untuk memberikan banyak jawaban konkret. Ada kuliah yang bagus di sini: http://introcs.cs.princeton.edu/java/91float/ ini mungkin sedikit mendasar, tapi ini perkenalan yang bagus jika Anda menggunakan java.

WPrecht
sumber
1

Bagaimana cara mengidentifikasi perhitungan floating point yang tidak stabil? Apakah ini teknik umum untuk menyelidiki pertanyaan ini?

Saya pikir kecuali Anda perlu menunjukkan statistik kesalahan, Anda tidak benar-benar perlu mengumpulkan sampel. Yang Anda butuhkan adalah Analisis Numerik , yang juga termasuk dalam subjek Metode Numerik, Aljabar Linier Numerik, dll. Dan mereka adalah bagian dari ilmu komputer, sehingga Anda mungkin mendapatkan beberapa jawaban juga di cs.stackexchange.

Bagaimanapun, dalam pemrograman umum, sebagian besar masalah mudah dikenali mengingat beberapa pemahaman dasar tentang bagaimana floating point bekerja dan metode numerik dasar. Tetapi masalah yang lebih kompleks adalah "lebih mudah" untuk diselesaikan hari ini dengan ketersediaan pelampung 128-bit, bahkan lebih sedikit alasan untuk menghasilkan sampel kesalahan. Berikut adalah beberapa contoh masalah untuk menunjukkan maksud saya:

  1. menggunakan floating point untuk menghitung nilai moneter.
  2. menggunakan floating point untuk angka besar.
  3. tidak melakukan divisi sebelum operasi lain ketika dimungkinkan untuk melakukannya. (untuk membuat nilai lebih dekat ke 0).
  4. perhitungan panjang tanpa perlakuan khusus untuk propagasi kesalahan.

Ada juga contoh algoritma naif dan algoritma kompensasi kesalahan di sini algoritma untuk menghitung varian . Dalam contoh, melihat versi naif, Anda bisa mencium bahwa melakukan perhitungan dalam loop akan membawa beberapa kesalahan dan tidak dikompensasi.

imel96
sumber
Terima kasih atas jawaban Anda, namun saya mencari informasi yang lebih rinci. Saya memiliki perhitungan yang sangat besar dan ingin mengidentifikasi bagian-bagian yang lemah. Saya mengedit pertanyaan sesuai.
user40989
Saya tidak yakin apa situasi Anda ketika Anda mengatakan Anda memiliki perhitungan besar dan ingin mengidentifikasi bagian yang lemah. Perhitungan numerik secara inheren memiliki kesalahan di dalamnya, bahkan satu operasi penambahan sederhana. Jadi, kecuali jika perhitungan Anda yang besar dikompensasi dengan kesalahan, maka semuanya perlu diperbaiki. Memperbaiki titik yang lebih lemah mungkin tidak cukup baik. Jika Anda sekarang menjadi "epsilon" dari model floating point Anda, analisis sederhana akan menunjukkan seberapa besar kesalahan yang dapat diperbanyak saat mereka merambat melalui perhitungan yang panjang.
imel96
0

Anda dapat menghindari kesalahan numerik dengan menggunakan tipe data yang sesuai (seperti, misalnya, pecahan lanjutan). Jika Anda perlu atau ingin menggunakan aritmatika floating point, Anda perlu menerapkan pengetahuan numerik untuk mengetahui kesalahannya.

Ingo
sumber
Saya tidak ingin menghindari kesalahan numerik, saya ingin mencari bagian mana dari perhitungan yang tidak stabil. Ini mirip dengan bottleneck kecepatan lokal ketika mengoptimalkan untuk kecepatan. Jadi saya ingin mengoptimalkan presisi dan karena itu ingin menemukan kemacetan presisi. (Fraksi lanjutan tidak berguna di sini.)
user40989
1
@ user40989, maka Anda pasti membutuhkan interval arithmetics.
SK-logic