Saya mencoba menyelesaikan persamaan 2D Poisson dengan perbedaan hingga. Dalam prosesnya, saya mendapatkan matriks jarang dengan hanya variabel di setiap persamaan. Misalnya, jika variabelnya adalah , maka diskritisasi akan menghasilkan:
Saya tahu bahwa saya dapat menyelesaikan sistem ini dengan metode berulang, tetapi saya berpikir bahwa jika saya memesan variabel dengan tepat, saya mungkin dapat memperoleh matriks berpita yang dapat diselesaikan dengan metode langsung (yaitu, eliminasi Gaussian. / o berputar). Apakah ini mungkin? Apakah ada strategi untuk melakukan ini untuk sistem lain yang mungkin kurang terstruktur?
Jawaban:
Ini adalah masalah yang dipelajari dengan baik di bidang pemecah langsung-jarang. Saya sangat merekomendasikan membaca ikhtisar Joseph Liu tentang metode multifrontal untuk mendapatkan ide yang lebih baik tentang bagaimana pemesanan ulang dan supernode mempengaruhi waktu pengisian dan solusi.
Diseksi bersarang adalah cara yang sangat umum untuk menghasilkan pemesanan ulang, dan pada dasarnya terdiri dari partisi grafik rekursif. MeTiS adalah standar de facto untuk partisi grafik, dan Anda dapat membaca tentang beberapa ide di baliknya di sini . Paket lain yang umum digunakan adalah SCOTCH , dan Chaco juga penting, karena penulisnya memperkenalkan partisi grafik multi-level , yang juga merupakan ide mendasar di balik MeTiS .
George dan Liu menunjukkan dalam buku klasik mereka yang 2d solusi jarang-langsung hanya membutuhkan kerja dan O ( n log n ) memori, sedangkan 3d jarang-direct membutuhkan O ( n 2 ) kerja dan O ( n 4 / 3 ) memori.O(n3/2) O(nlogn) O(n2) O(n4/3)
sumber
Cuthill-McKee adalah standar de facto untuk apa yang ingin Anda lakukan. Jika Anda ingin bermain dengan metode ini, ada implementasi algoritma yang mudah digunakan (dan kebalikannya) di Boost Graph Library (BGL), dan dokumentasi berisi contoh cara menggunakannya.
sumber
Berbicara tentang metode multifrontal, Tim Davis , yang bekerja pada metode multifrontal untuk faktorisasi LU ( UMFPACK ) memiliki sejumlah rutin yang akan menyusun ulang matriks untuk meminimalkan pengisian. Anda dapat menemukannya di sini sebagai bagian dari SuiteSparse . SuiteSparse menggunakan MeTiS.
Satu hal lagi yang perlu diperhatikan: Dalam beberapa masalah, Anda bisa pandai tentang pemesanan variabel sehingga Anda mendapatkan banded, atau dekat dengan banded, pola, yang dapat menyelamatkan Anda dari masalah (dan waktu CPU) dalam memanggil algoritma ini. Namun, pengurutan ulang yang cerdik ini membutuhkan wawasan dari Anda dan sama sekali tidak umum seperti algoritma pengurutan ulang berbasis teori-grafik yang disebutkan orang dalam jawaban mereka di sini.
sumber
Ada algoritma yang disebut ADI (Alternating Direction Implicit) dalam lingkaran matematika terapan dan operator perpecahan dalam lingkaran fisika yang pada dasarnya melakukan apa yang Anda gambarkan. Ini adalah metode berulang, dan mengikuti prosedur dasar ini:
Untuk setiap nilai , bersantai di arah- x . Matriks ini harus tridiagonal, sehingga dapat diselesaikan secara langsung dalam waktu yang relatif sedikit.y x
Untuk setiap nilai , bersantai di y- directional. Sekali lagi, ini seharusnya cukup cepat.x y
Ulangi 1 dan 2 hingga kesalahannya sekecil yang Anda inginkan.
Saya tidak tahu kompleksitas formal dari algoritma ini, tetapi saya menemukan itu untuk menyatu dalam iterasi yang lebih sedikit daripada hal-hal seperti Jacobi dan Gauss-Seidel setiap kali saya menggunakannya.
sumber