Saya mencoba mendiagonalisasi beberapa matriks yang padat dan tidak terkondisikan. Dalam presisi mesin, hasilnya tidak akurat (mengembalikan nilai eigen negatif, vektor eigen tidak memiliki simetri yang diharapkan). Saya beralih ke fungsi Mathematica Eigensystem [] untuk mengambil keuntungan dari presisi yang berubah-ubah, tetapi perhitungannya sangat lambat. Saya terbuka untuk sejumlah solusi. Apakah ada paket / algoritma yang cocok untuk masalah yang dikondisikan? Saya bukan ahli prakondisi, jadi saya tidak yakin seberapa banyak ini bisa membantu. Kalau tidak, yang bisa saya pikirkan adalah pemecah nilai eigen presisi yang diparalelkan secara acak, tetapi saya tidak terbiasa dengan apa pun di luar Mathematica, MATLAB dan C ++.
Untuk memberikan latar belakang masalah, matriksnya besar, tetapi tidak besar (paling banyak 4096x4096 hingga 32768x32768). Mereka nyata, simetris, dan nilai eigen dibatasi antara 0 dan 1 (eksklusif), dengan banyak nilai eigen sangat dekat dengan 0 dan tidak ada yang mendekati 1. Matriks pada dasarnya adalah operator konvolusi. Saya tidak perlu mendiagonalisasi semua matriks saya, tetapi semakin besar saya bisa, semakin baik. Saya memiliki akses ke cluster komputasi dengan banyak prosesor dan kemampuan komputasi terdistribusi.
Terima kasih
Jawaban:
Hitung SVD sebagai pengganti dekomposisi spektral. Hasilnya sama dalam aritmatika persis, karena matriks Anda pasti pasti simetris, tetapi dalam aritmatika presisi terbatas, Anda akan mendapatkan nilai eigen kecil dengan akurasi lebih banyak.
Sunting: Lihat Demmel & Kahan, Nilai Singular Akurat dari Matriks Bidiagonal, SIAM J. Sci. Stat. Komputasi. 11 (1990), 873-912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf
Edit2; Perhatikan bahwa tidak ada metode yang dapat menyelesaikan nilai eigen yang lebih kecil dari pada norma waktu akurasi mesin yang digunakan, karena mengubah entri tunggal dengan satu ulp mungkin sudah mengubah nilai eigen kecil dengan ini. Jadi mendapatkan nol nilai eigen sebagai pengganti yang sangat kecil adalah tepat, dan tidak ada metode (kecuali bekerja dengan presisi yang lebih tinggi) akan mengurai vektor eigen yang sesuai, tetapi hanya mengembalikan dasar untuk ruang nol numerik yang umum.
sumber
Terima kasih atas saran ini. Saya mencoba perintah SVD Mathematica, tetapi saya tidak mendapatkan peningkatan yang nyata (masih kehilangan simetri yang sesuai, 'nilai eigen' salah nol di mana mereka salah keluar negatif sebelumnya). Mungkin saya perlu mengimplementasikan salah satu algoritma yang Anda jelaskan di atas alih-alih fungsi bawaan? Saya mungkin ingin menghindari masalah menggunakan metode tertentu seperti ini kecuali saya yakin sebelumnya bahwa itu akan menawarkan peningkatan yang signifikan.
@ JackPoulson, saya membaca skrip tentang metode Jacobi yang Anda referensikan, dan itu terlihat menjanjikan. Bisakah Anda atau siapa pun merekomendasikan cara yang baik untuk menerapkan metode Jacobi untuk menemukan sistem eigens? Saya menduga bahwa jika saya mengkodekannya sendiri (dalam MATLAB), itu akan sangat lambat.
sumber