Liên tục giải


12

Tôi đang sử dụng MATLAB để giải quyết vấn đề liên quan đến việc giải ở mọi dấu thời gian , trong đó b thay đổi theo thời gian. Ngay bây giờ, tôi đang thực hiện điều này bằng cách sử dụng MATLAB :Ax=bbmldivide

x = A\b

Tôi có khả năng linh hoạt để thực hiện nhiều tính toán trước khi cần, vì vậy tôi tự hỏi liệu có phương pháp nào nhanh hơn và / hoặc chính xác hơn không mldivide. Điều gì thường được thực hiện ở đây? Cảm ơn tất cả!


1
Bạn có kiến ​​thức cụ thể về cấu trúc của không? Chẳng hạn, nó có đối xứng không? Tích cực nhất định? Tridia chéo? Trực giao? Một
Dominique

Ma trận là ma trận vuông dày đặc. Một
Nghi ngờ

3
Nếu bạn không có kiến ​​thức nào khác về , thì hệ số L U như được mô tả trong câu trả lời dưới đây là đặt cược tốt nhất của bạn. MộtLBạn
Dominique

Câu trả lời:


14

Điều rõ ràng nhất bạn có thể làm là tính toán trước

[L,U] = lu(A) ~ O (n ^ 3)

Sau đó, bạn chỉ cần tính toán

x = U \ (L \ b) ~ O (2 n ^ 2)

Điều này sẽ giảm chi phí rất lớn và làm cho nó nhanh hơn. Độ chính xác sẽ là như nhau.


1
Lưu ý, từ tài liệu , L không nhất thiết phải là tam giác thấp hơn. Câu trả lời này có thể sẽ nhanh hơn giải quyết trực tiếp, tuy nhiên tôi sẽ cẩn thận để đảm bảo rằng lệnh L \ b đủ thông minh để biết giải quyết L theo đúng thứ tự (có thể là vậy, nhưng nó không nói chắc chắn trong tài liệu).
Godric Seer

Vâng bạn đúng, L là sản phẩm của ma trận tam giác dưới và ma trận hoán vị. Nhưng tôi sẽ bị nguyền rủa nếu nó không nhận ra rằng tất cả những gì nó phải làm là thay thế bằng L\b. Bởi vì tôi đã thấy dòng chính xác này được sử dụng trong mã hiệu suất cao bởi những người tôi coi là chuyên gia.
Milind R

8
mldivide nhận ra ma trận tam giác thấm và thực hiện đúng trong việc giải hệ như vậy. Tuy nhiên, trong các thử nghiệm của tôi, điều này dường như làm cho quá trình giải pháp chậm hơn với hệ số 10 hoặc hơn cho ma trận có kích thước 2000 đến 2000 đến 10000. Do đó, bạn nên theo dõi rõ ràng về hoán vị bằng cách sử dụng [L , U, P] = lu (P). O(n2)
Brian Borchers

1
Ngoài ra, nếu ma trận của bạn thưa thớt, bạn nên tận dụng sự thưa thớt trong việc giải quyết hệ thống. Cách đơn giản nhất để làm điều này là đảm bảo rằng được lưu trữ ở định dạng thưa thớt bằng cách sử dụng A = thưa (A) trước khi tính toán hệ số LU. Bạn cũng có thể thử hoán vị các hàng của A để giảm điền vào trong quá trình nhân tố LU. Một
Brian Borchers

3
@BrianBorcher Theo tôi biết, cách tốt nhất để theo dõi hoán vị là [L,U,p] = lu(A,'vector'); x = U\(L\b(p));Xem ví dụ 3 trong các lu tài liệu .
Stefano M

5

Chúng tôi đã làm một số phòng thí nghiệm máy tính rộng rãi trong các khóa học máy tính khoa học của chúng tôi về chủ đề này. Đối với các phép tính "nhỏ" mà chúng tôi đã thực hiện ở đó, toán tử dấu gạch chéo ngược của Matlab luôn nhanh hơn bất kỳ thứ gì khác, ngay cả sau khi chúng tôi đã tối ưu hóa mã của mình nhiều nhất có thể và sắp xếp lại tất cả các ma trận trước đó (ví dụ như đặt hàng Reverse Cuthill McKee cho ma trận thưa thớt) .

Bạn có thể kiểm tra một trong những hướng dẫn trong phòng thí nghiệm của chúng tôi . Câu trả lời cho câu hỏi của bạn được trình bày (trong thời gian ngắn) trên trang 4.

Một cuốn sách hay về chủ đề này được viết bởi Cheney .


4

Giả sử là một n × n rậm rạp ma trận và bạn phải giải quyết Một x i = b i , i = 1 ... m . Nếu mAn×n Axi=bii=1mm đủ lớn thì không có gì là sai trong

V = inv(A);
...
x = V*b;

O(n3)inv(A)O(n2)V*bm một số thử nghiệm là cần thiết ...

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

Một số lưu ý

Để ổn định và phân tích lỗi xin vui lòng xem các ý kiến ​​khác nhau này câu trả lời , đặc biệt là của VictorLiu.

mn

Thời gian được thực hiện với Matlab R2011b trên máy tính 12 lõi với trung bình tải UNIX khá ổn định là 5; tic, tocthời gian tốt nhất của ba tàu thăm dò.


Thật vậy, có nhiều sự song song có sẵn trong một vectơ ma trận nhân hơn so với bộ giải tam giác, vì vậy điều này sẽ còn rõ ràng hơn nếu các phép tính được thực hiện song song (đa lõi / GPU / vv ...) theo bất kỳ cách nào.
Aron Ahmadia

@AronAhmadia Tôi đồng ý: ước tính điểm hòa vốn chỉ dựa trên số lượng hoạt động chỉ có ý nghĩa đối với việc triển khai nối tiếp.
Stefano M

1
Lưu ý rằng mọi thứ sẽ khác nhau rất nhiều nếu ma trận A thưa thớt - nghịch đảo thường sẽ khá dày đặc, trong khi các yếu tố LU thường khá thưa thớt, khiến mọi thứ quay trở lại theo hướng LU nhanh hơn.
Brian Borchers

1
Một

1
inv(A)Mộtx= =bbBA\B

2

Hãy xem câu hỏi này , các câu trả lời cho thấy mldividekhá thông minh, và cũng đưa ra gợi ý về cách xem Matlab sử dụng cái gì để giải quyết A\b. Điều này có thể cung cấp cho bạn một gợi ý về các tùy chọn tối ưu hóa.


0

Sử dụng dấu gạch chéo ngược ít nhiều tương đương với inv(A)*B , nếu bạn mã hóa nó một cách tự do, thì cái sau có thể trực quan hơn. Chúng giống nhau (chỉ khác nhau về cách tính toán được thực hiện), mặc dù bạn nên kiểm tra tài liệu Matlab để làm rõ.

Để trả lời câu hỏi của bạn, dấu gạch chéo ngược thường tốt, nhưng nó phụ thuộc vào các thuộc tính của ma trận khối.


1
Về mặt toán học inv (A) * b giống như \ tuy nhiên về mặt số lượng, thực sự hình thành nghịch đảo vừa kém hiệu quả vừa kém chính xác. Nếu bạn đang làm việc để học đại số tuyến tính, điều này có thể được chấp nhận, nhưng tôi cho rằng bạn cần một lý do rất chính đáng để hình thành nghịch đảo.
Godric Seer

Nhưng tại sao bạn lại tính toán inv(A)vì một mình nó đắt hơn A\b?
Dominique

7
@Godric: Có một bài báo gần đây thảo luận về "huyền thoại" mà inv (A) * b ít chính xác hơn: trên ArXiv . Không nói rằng thường có lý do để tính toán nghịch đảo thực tế, nhưng chỉ cần nói.
Victor Liu

3
@Dominique: Các phép giải tam giác ít song song hơn nhiều so với phép nhân vectơ ma trận và các phương pháp lặp tiền điều kiện phức tạp thường sử dụng các phương thức trực tiếp trên các tên miền phụ. Nó thường hữu ích để hình thành rõ ràng các nghịch đảo của một vài ma trận tam giác dày đặc có kích thước khiêm tốn để cải thiện sự song song.
Jack Poulson

@VictorLiu: Cảm ơn bạn về bài viết. Tôi đã sửa chữa trên tuyên bố chính xác của mình (ít nhất cho việc triển khai thông minh inv (A)).
Godric Seer
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.