Bộ giải tuyến tính thưa thớt cho nhiều phía bên tay phải


12

Tôi cần giải quyết cùng một hệ thống tuyến tính thưa thớt (300x300 đến 1000x1000) với nhiều cạnh bên phải (300 đến 1000). Ngoài vấn đề đầu tiên này, tôi cũng muốn giải quyết các hệ thống khác nhau, nhưng với cùng các phần tử khác không (chỉ là các giá trị khác nhau), đó là nhiều hệ thống thưa thớt với mô hình thưa thớt không đổi. Ma trận của tôi là vô thời hạn.

Hiệu suất của yếu tố và khởi tạo không quan trọng, nhưng hiệu suất của giai đoạn giải quyết là. Hiện tại tôi đang xem xét PaStiX hoặc Umfpack, và tôi có thể sẽ chơi xung quanh với Thú cưng (hỗ trợ cả người giải) Có thư viện nào có khả năng tận dụng các nhu cầu cụ thể của tôi (vector hóa, đa luồng) hay tôi nên dựa vào người giải quyết chung và có thể sửa đổi chúng một chút cho nhu cầu của tôi?

Điều gì xảy ra nếu ma trận thưa thớt lớn hơn, lên tới ?106×106

Câu trả lời:


10

Không đứng về phía thảo luận về việc nên sử dụng bộ giải trực tiếp hay lặp, tôi chỉ muốn thêm hai điểm:

  1. Có các phương pháp Krylov tồn tại cho các hệ thống có nhiều phía bên phải (được gọi là phương pháp khối Krylov ). Là một phần thưởng bổ sung, chúng thường có tốc độ hội tụ nhanh hơn các phương pháp Krylov tiêu chuẩn do không gian Krylov được xây dựng từ một tập hợp các vectơ lớn hơn. Xem Dianne P. O'Leary, Thuật toán khối liên hợp khối và các phương pháp liên quan . Đại số tuyến tính và các ứng dụng của nó 29 (1980), trang 239-322. Martin H. Gutknecht, phương pháp không gian Block Krylov cho các hệ thống tuyến tính có nhiều phía bên tay phải: Giới thiệu (2007).

  2. Nếu bạn có các ma trận khác nhau với cùng một mô hình thưa thớt, bạn có thể tính toán trước một hệ số ký hiệu cho ma trận đầu tiên, có thể được sử dụng lại trong việc tính toán hệ số số cho ma trận này và các ma trận tiếp theo. (Trong UMFPACK, bạn có thể thực hiện việc này bằng cách sử dụng umfpack di symbolicvà chuyển kết quả đến umfpack_di_numeric.)


9

Thông thường có sự đánh đổi giữa số lượng công việc bạn đưa vào để xây dựng một điều kiện tiên quyết tốt cho một người giải quyết lặp và công việc bạn tiết kiệm bằng cách sử dụng một điều kiện tiên quyết tốt khi thực sự giải quyết các hệ thống tuyến tính. Trong trường hợp của bạn, trường hợp này khá rõ ràng: hãy đặt càng nhiều công việc càng tốt vào việc xây dựng một điều kiện tiên quyết tốt vì bạn phải giải quyết rất nhiều hệ thống tuyến tính. Trên thực tế, tôi nghĩ rằng nên đầu tư thời gian để có được điều kiện tiên quyết hoàn hảo: phân tách LU (ví dụ sử dụng UMFPACK hoặc bộ giải Pardiso là một phần của MKL của Intel). Sau đó, chỉ cần áp dụng phân tách này nhiều lần khi cần thiết. Nếu bạn có hệ thống tuyến tính để giải quyết, không có gì có thể được mong đợi để đánh bại một phân tách chính xác.O(N)


4
Tuyên bố cuối cùng của bạn là tranh cãi. Hãy xem xét một thừa số multifrontal chính xác của một 3D FEM hoặc FD rời rạc trên một khối lập phương, mà phải đòi hỏi công việc và O ( N 4 / 3 ) sử dụng bộ nhớ. Các giải chính xác do đó yêu cầu O ( N 4 /O(N2)O(N4/3)flops mỗi bên tay phải, và vì vậy, cho đủ lớnN, bất kỳ giải lặp đi lặp lại với một phức tạp tiệm cận thấp hơn sẽ nhanh hơn. O(N4/3)N
Jack Poulson

3
Có lẽ. Nhưng như một vấn đề cần cân nhắc thực tế, các bộ giải trực tiếp thưa thớt vẫn nhanh chóng cho rằng hằng số ở ngay cả một bộ giải là khá lớn trong khi hằng số ở phía trước O (O(N) thì không. O(N4/3)
Wolfgang Bangerth

2
Điều hấp dẫn là bạn chạy theo trí nhớ và sự kiên nhẫn cho yếu tố này ở điểm giao nhau. Đối với Laplacian 7 điểm, multigrid cần khoảng 50 flops / dof, dẫn đến sự giao nhau của flops (so với giải quyết ngược) ở khoảng dofs. Giải pháp ngược sử dụng nhiều bộ nhớ hơn, nhưng hạt nhân cho nhiều phía bên tay phải thường có sẵn. Multigrid thường không được viết cho nhiều phía bên tay phải, do đó hy sinh tiềm năng vector hóa. Tôi muốn rằng bạn có thể viết một thuật toán MG trong đó thời gian cho mỗi RHS ít hơn một CHOLMOD (hoặc bất kỳ gói nào khác) giải quyết ngược cho 3D Laplacian ở khoảng n < 300 k . 105n<300k
Jed Brown

3

Bạn không hoàn toàn rõ ràng trong tuyên bố của mình về vấn đề khi bạn nói về "các phần tử khác không (chỉ các giá trị khác nhau)" Bạn có nói rằng ma trận có mô hình thưa thớt không đổi nhưng giá trị thực thay đổi? Hoặc, bạn đang nói rằng ma trận trong thực tế là không đổi?

Giả sử ma trận thưa thớt không đổi và chỉ có phía bên tay phải thay đổi, thì bạn nên xem xét các phương pháp sử dụng hệ số nhân trực tiếp (có dạng PMột= =LBạnÔi(n2)

Đối với nhiều phía bên tay phải và hệ phương trình có kích thước này, các phương pháp lặp thường không có giá trị trong khi.

Tất cả các gói bạn đã đề cập đều cung cấp các phương thức nhân tố trực tiếp (mặc dù PetSc hầu hết được biết đến với các bộ giải lặp.) Tuy nhiên, các hệ thống của bạn rất nhỏ đến mức không có khả năng bạn có thể tăng tốc song song đáng kể, đặc biệt là trong môi trường bộ nhớ phân tán.

Tôi khuyên bạn nên sử dụng Umfpack cho công việc này - PaStix và PetSc là quá mức cần thiết.


Cảm ơn câu trả lời của bạn. Để làm rõ: trước tiên tôi đã yêu cầu một ma trận có nhiều cạnh bên phải, và sau đó, một vấn đề khác là một tập hợp các ma trận có cùng độ thưa thớt nhưng các giá trị thay đổi, mỗi giá trị phải được giải cho nhiều rhs. Câu hỏi phụ: nếu ma trận thưa thớt bây giờ là 10 ^ 5x10 ^ 5 đến 10 ^ 6x10 ^ 6 thì sao?
nat chouf

2
105

Sử dụng phương pháp lặp cho các hệ thống lớn hơn của bạn chỉ bằng một bên tay phải có thể có ý nghĩa, đặc biệt nếu bạn không cần các giải pháp rất chính xác và đặc biệt nếu bạn có thể tìm thấy một điều kiện tiên quyết hiệu quả hoặc hệ thống của bạn đã được điều hòa tốt. Tuy nhiên, nếu hệ thống của bạn bị điều hòa kém, bạn cần các giải pháp chính xác và bạn không thể tìm thấy một điều kiện tiên quyết tốt, thì có khả năng bạn vẫn sẽ tốt hơn với yếu tố trực tiếp.
Brian Borchers

N106
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.