Bahaya aritmatika kompleks dalam komputasi ilmiah


11

Produk dalam kompleks memiliki dua definisi berbeda yang diputuskan oleh konvensi: atau . Di BLAS, saya menemukan rutinitas cdotu, zdotu, dan cdotc, zdotc. Dua rutinitas yang pertama sebenarnya menghitung (produk dalam palsu!) Dan dua rutinitas terakhir mengkonjugasikan vektor pertama dalam produk dalam. Juga, berdasarkan definisi (konjugasi atau ), dengan konjugasi! Selain itu, seperti yang ditunjukkan dalam komentar, memilih nilai-nilai utama untuk fungsi kompleks multi-nilai dapat bergantung pada konvensi.kamu,vkamu¯TvkamuTv¯kamuTvkamuvkamu,v=v,kamu¯

Pertanyaan saya adalah: apakah komplikasi ini menyebabkan bahaya nyata untuk penggunaan aritmatika kompleks dalam komputasi ilmiah? Masalah ini ditekankan oleh penulis dari deal.ii yang menyarankan untuk selalu membagi bilangan kompleks menjadi bagian nyata dan imajiner dan menggunakan aritmatika nyata saja. Tetapi saya tidak pernah menemukan pendekatan pemisahan itu nyaman. Misalnya, pikirkan tentang PML untuk persamaan Maxwell yang selaras waktu.

Tampaknya kekhawatiran menggunakan bilangan kompleks lazim di sebagian besar perangkat lunak FEM open source kecuali FreeFem ++ dan libmesh. Tetapi bahkan untuk dua pengecualian, aritmatika kompleks kurang diuji daripada yang sebenarnya.

Pertanyaan terakhir saya adalah: haruskah kita selalu menghindari menggunakan bilangan kompleks?


3
Apakah ada yang benar-benar tahu akar mana dan mana yang ? Tampaknya pengembang perangkat lunak harus menyertakan serangkaian contoh uji kecil dalam paket regresi mereka untuk mencegah penggabungan konjugasi tidak konsisten dalam rantai panjang perhitungan aritmatika kompleks. -1saya-saya
hardmath

@hardmath Terima kasih! Saya menambahkannya dalam pertanyaan.
Hui Zhang

@hardmath: "sekumpulan contoh uji" - di sebagian besar perpustakaan yang secara komprehensif menerapkan operasi aljabar linier, kemungkinan akan ada puluhan atau ratusan tempat di mana produk dalam diambil. Diperlukan ratusan tes untuk memverifikasi kebenarannya, mungkin butuh berbulan-bulan untuk diterapkan dengan benar. Tentu saja itu tidak mustahil, dan beberapa perpustakaan telah melakukannya. Ini hanya banyak pekerjaan dan tidak semua penulis perpustakaan yakin bahwa mereka melakukannya dengan benar :-(
Wolfgang Bangerth

@ WolfgangBangerth, mungkin Anda bisa menjelaskan keputusan desain deal.ii?
Bill Barth

3
Haruskah kita selalu menghindari menggunakan bilangan kompleks? Tolong jangan. Saya percaya setiap ilmuwan komputasi membutuhkan dekomposisi nilai eigen yang tidak simetris, misalnya.
Federico Poloni

Jawaban:


2

Anda mengatakan bahwa masalah dengan aritmatika kompleks adalah bahwa ada berbagai cara untuk mendefinisikan produk skalar untuk vektor kompleks, dibandingkan dengan hanya satu cara dalam kasus nyata. Saya pikir masalah sebenarnya dengan produk skalar kompleks adalah masalah lain, yang, bagaimanapun, terkait erat dengan pengamatan Anda.

Dalam aritmatika yang kompleks, urutan argumen dari produk skalar memang penting, sedangkan dalam aritmatika nyata, mereka tidak penting. Banyak algoritma pada dasarnya sama dalam aritmatika kompleks dan nyata, artinya Anda hanya perlu menulisnya sekali dan kemudian menggunakan kode yang sama untuk aritmatika kompleks dan nyata. (Misalnya, dalam C ++ Anda dapat menggunakan templat untuk tujuan ini.) Ketika Anda selesai menulis kode, biasanya Anda mengujinya. Untuk mengungkap kesalahan dalam pemesanan argumen di beberapa produk skalar, Anda harus menguji kode Anda dengan test case bernilai kompleks.

Anda sering mendapatkan kode bernilai nyata untuk suatu algoritma secara gratis ketika Anda memiliki kode kerja untuk masalah yang dinilai rumit. Ketika Anda telah menguji kode Anda dengan case uji yang bernilai kompleks, kode tersebut sering juga benar untuk bilangan real. Mengubah, kode bernilai riil menjadi kode yang kompleks, bagaimanapun, membutuhkan kerja tambahan. Oleh karena itu, hanya ada lebih banyak kode yang hanya berfungsi (dan diuji secara menyeluruh) untuk nilai nyata daripada untuk masalah bernilai kompleks.

Pertanyaan saya adalah: apakah komplikasi ini menyebabkan bahaya nyata untuk penggunaan aritmatika kompleks dalam komputasi ilmiah?

Saya akan mengatakan "Ya", dengan cara berikut. Ketika kode tidak diuji dengan baik untuk masalah yang bernilai kompleks, ada kemungkinan bug lebih tinggi dalam kode, tetapi ini tergantung pada kode konkret yang Anda lihat. Ketika kode diuji dengan baik, tidak ada masalah.

Pertanyaan terakhir saya adalah: haruskah kita selalu menghindari menggunakan bilangan kompleks?

Seperti yang sudah ditunjukkan, ada masalah yang tidak bisa dipecahkan menggunakan bilangan real. Misalnya, perhitungan nilai eigen dari matriks tidak simetris. Oleh karena itu, kita memerlukan aritmatika yang kompleks.


-1

Makalah ini relevan:

Pemotongan Cabang untuk Fungsi Kompleks Elementer atau Banyak Lagi Tentang Tentang Tidak Ada Tanda Bit.

http://people.freebsd.org/~das/kahan86branch.pdf


5
Selamat datang di SciComp! Mungkin Anda bisa menjelaskan lebih lanjut mengapa makalah yang Anda tautkan relevan? Ringkasan akan membuat jawaban Anda lebih berharga, dan lebih cenderung terangkat naik. Kami cenderung untuk mencegah jawaban yang menambahkan tautan tanpa konteks yang memadai.
Geoff Oxberry
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.