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.
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?
sumber
Jawaban:
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.
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.
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.
sumber
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
sumber