2013-09-03 110 views
5

Tôi đang cố gắng tìm ra cách giải quyết hiệu quả hệ thống tam giác thưa thớt, Au * x = b trong scipy thưa thớt.Giải quyết hệ thống tam giác trên thưa thớt

Ví dụ, chúng ta có thể xây dựng một ma trận thưa thớt trên hình tam giác, Au, và một tay phải phía b với:

import scipy.sparse as sp 
import scipy.sparse.linalg as sla 
import numpy as np 

n = 2000 
A = sp.rand(n, n, density=0.4) + sp.eye(n) 
Au = sp.triu(A).tocsr() 
b = np.random.normal(size=(n)) 

Chúng ta có thể có được một giải pháp cho vấn đề sử dụng spsolve, tuy nhiên nó là rõ ràng rằng cấu trúc tam giác không bị lợi dụng. Điều này có thể được chứng minh bằng cách định thời gian giải pháp và so sánh nó với phương pháp giải quyết trong splu. (Ở đây sử dụng% thời gian kỳ diệu ipython của)

%time x1 = sla.spsolve(Au,b) 
CPU times: user 3.63 s, sys: 79.1 ms, total: 3.71 s 
Wall time: 1.1 s 

%time Au_lu = sla.splu(Au) 
CPU times: user 3.61 s, sys: 62.2 ms, total: 3.67 s 
Wall time: 1.08 s 

%time x2 = Au_lu.solve(b) 
CPU times: user 25 ms, sys: 332 µs, total: 25.4 ms 
Wall time: 7.01 ms 

Như Au đã trên bên tam giác cuộc gọi đến splu thực sự không nên làm nhiều bất cứ điều gì, tuy nhiên, như n được lớn cuộc gọi này trở nên đắt đỏ (cũng như việc sử dụng spsolve), trong khi thời gian giải quyết vẫn còn nhỏ.

Có cách nào để sử dụng bộ giải tam giác siêu của superLU mà không cần gọi đầu tiên không? Hoặc là có cách nào tốt hơn để làm điều này hoàn toàn?

+1

Tôi sử dụng 'timeit' trong' ipython. 'spsolve' đo khoảng 90ms. 'splu' mất một vài giây. 'sla.spsolve (Au, b, use_umfpack = False)' nằm trong phạm vi 1-2 giây. 'linalg.solve_triangular (Au.toarray(), b)' chậm hơn 'spsolve' (200ms). Cũng so sánh các câu trả lời. Các giá trị lớn của x2 không gần với x1. – hpaulj

+0

Bạn nên xem xét liệu một giải pháp lặp lại có thể phù hợp hơn với vấn đề của bạn là giải pháp trực tiếp hay không. Xem thảo luận này: http://scicomp.stackexchange.com/questions/81/what-guidelines-should-i-follow-when-choosing-a-sparse-linear-system-solver –

+1

Tôi cần bộ giải tam giác là cần thiết để thực hiện điều kiện tiên quyết SSOR cho các giải pháp lặp. Tôi đã viết một giải pháp nhanh chóng bằng cách sử dụng fortran và f2py nhưng vẫn sẽ là một giải pháp gói python/chính. – dwfm

Trả lời

0

Tôi e rằng đây không phải là một hướng dẫn khủng khiếp, nhưng bạn đã thử thay đổi hoán vị cột chưa? Khi tôi sử dụng "TỰ NHIÊN", tôi nhận được rất nhiều tốc độ.

%time x1 = sla.spsolve(Au, b, permc_spec="NATURAL") 
CPU time: user 46.7 ms, sys: 0 ns, total: 46.7 ms 
Wall time: 49 ms 

Đối với tôi, nó không hoàn toàn nhanh bằng cách sử dụng phương pháp giải quyết đầu ra hàm splu, nhưng dường như có được gần đúng (và tránh splu gọi). Có lẽ điều đó sẽ đủ? Scipy Docs