Saya menggunakan MATLAB untuk memecahkan masalah yang melibatkan penyelesaian di setiap timestep, di mana berubah seiring waktu. Saat ini, saya menyelesaikan ini menggunakan MATLAB :bmldivide
x = A\b
Saya memiliki fleksibilitas untuk membuat sebanyak mungkin perhitungan yang diperlukan, jadi saya bertanya-tanya apakah ada metode yang lebih cepat dan / atau lebih akurat daripada mldivide
. Apa yang biasanya dilakukan di sini? Terima kasih semuanya!
Jawaban:
Hal paling jelas yang dapat Anda lakukan adalah melakukan precompute
[L,U] = lu(A)
~ O (n ^ 3)Maka Anda hanya menghitung
x = U \ (L \ b)
~ O (2 n ^ 2)Ini akan sangat mengurangi biaya dan membuatnya lebih cepat. Akurasi akan sama.
sumber
L\b
. Karena saya telah melihat baris yang tepat ini digunakan dalam kode kinerja tinggi oleh mereka yang saya anggap ahli.[L,U,p] = lu(A,'vector'); x = U\(L\b(p));
Lihat contoh 3 dilu
dokumen .Kami melakukan beberapa laboratorium komputer dalam kursus komputasi ilmiah kami tentang topik ini. Untuk perhitungan "kecil" yang kami lakukan di sana, operator backslash Matlab selalu lebih cepat daripada yang lain, bahkan setelah kami mengoptimalkan kode kami sebanyak mungkin dan menyusun ulang semua matriks sebelumnya (misalnya dengan pemesanan Reverse Cuthill McKee untuk matriks jarang) .
Anda dapat memeriksa salah satu instruksi lab kami . Jawaban untuk pertanyaan Anda dibahas (segera) di halaman 4.
Buku bagus tentang topik ini ditulis misalnya oleh Cheney .
sumber
Misalkan adalah matriks padat dan Anda harus menyelesaikan , . Jika adalah cukup besar maka tidak ada yang salah dalamn × n A x i = b i i = 1 ... m mA n×n Axi=bi i=1…m m
Flops adalah untuk dan untuk , oleh karena itu untuk menentukan nilai impas untuk beberapa eksperimen diperlukan ...O ( n 2 ) mO(n3) O(n2) m
inv(A)
V*b
Dalam contoh sepele ini pra-perhitungan lebih baik daripada maju dan mundur solusi untuk . L U m > 125A−1 LU m>125
Beberapa catatan
Untuk analisis stabilitas dan kesalahan, silakan lihat komentar untuk jawaban yang berbeda ini , terutama yang oleh VictorLiu.
Waktu yang diusulkan sama sekali tidak "ilmiah", tetapi dimaksudkan untuk menunjukkan bahwa pendekatan yang diusulkan dalam jawaban oleh Milind R, sementara itu masuk akal jika diimplementasikan dalam C atau Fortran dengan memanggil subrutin LAPACK dan BLAS yang relevan, mungkin terbukti tidak begitu efektif di Matlab, bahkan untuk .m≪n
Pengaturan waktu dilakukan dengan Matlab R2011b pada komputer 12 inti dengan rata-rata beban UNIX 5 yang cukup konstan;
tic, toc
waktu terbaik dari tiga probe.sumber
inv(A)
masuk akal hanya jika Anda harus berulang kali menyelesaikan untuk berbeda yang tidak semuanya diketahui pada saat yang sama. Biasanya jika Anda memiliki banyak sisi kanan, kumpulkan saja dalam matriks dan ikuti . b BA\B
Lihatlah pertanyaan ini , jawabannya menunjukkan bahwa
mldivide
itu cukup pintar, dan juga memberikan saran bagaimana cara melihat apa yang Matlab gunakan untuk menyelesaikannyaA\b
. Ini mungkin memberi Anda petunjuk tentang opsi pengoptimalan.sumber
Menggunakan backslash kurang lebih sama dengan
inv(A)*B
, jika Anda mengkodekannya secara bebas, yang terakhir mungkin lebih intuitif. Mereka hampir sama (hanya berbeda dalam bagaimana perhitungan dilakukan), meskipun Anda harus memeriksa dokumentasi Matlab untuk klarifikasi.Untuk menjawab pertanyaan Anda, backslash umumnya baik-baik saja, tetapi itu tergantung pada sifat-sifat matriks massa.
sumber
inv(A)
karena itu saja lebih mahal daripadaA\b
?