2013-09-03 13 views
5

Seyrek üçgensel sistemi, sc * * x = b scipy seyrek olarak nasıl verimli bir şekilde çözebileceğinizi bulmaya çalışıyorum.Kaba üst üçgen sistemini çözün

Örneğin, seyrek bir üst üçgen matris, Au, ve bir sağ taraftaki b gerçekleştirebilmesi: ancak olduğu açıktır, biz spsolve kullanılarak probleme bir çözüm elde edebilirsiniz

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)) 

üçgen yapıdan yararlanılmamaktadır. Bu, çözeltinin zamanlaması ve splu'daki çözme yöntemiyle karşılaştırılarak gösterilebilir. yaptığı gibi (n büyük olur bu çağrı pahalıya olduğunda Au gibi

%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 

, zaten gerçekten splu çağrısı Ancak fazla bir şey yapmamalıyız üst üçgen (Burada ipython en% zaman büyü kullanarak) çözme süresi küçük kalırken, spsolve kullanımı).

SuperLU'nun üçgensel çözücüsünü splu aramadan kullanmanın bir yolu var mı? Yoksa bunu daha iyi yapmanın daha iyi bir yolu var mı?

+1

'Ipython'da' timeit 'kullanıyorum. "90" yaklaşık 90ms ölçer. 'splu' birkaç saniye sürüyor. sla.spsolve (Au, b, use_umfpack = False) '1-2 sn aralığındadır. linalg.solve_triangular (Au.toarray(), b) 'spsolve'den (200ms) daha yavaştır. Ayrıca cevapları karşılaştırın. X2'nin büyük değerleri x1'inkilere yakın değildir. – hpaulj

+0

Yinelemeli bir çözümün sizin sorununuza daha uygun olabileceğini düşünmelisiniz. Bu tartışmaya bakın: http://scicomp.stackexchange.com/questions/81/what-guidelines-should-i-follow-when-choosing-a-sparse-linear-system-solver –

+1

Üç yüze çözücüye ihtiyacım var. Yinelemeli çözücüler için bir SSOR önkoşul uygular. Fortran ve f2py kullanarak hızlı bir çözüm yazdım ama yine de yerel bir python/büyük paket çözümünü tercih ediyorum. – dwfm

cevap

0

Korkarım ki bu çok öğretici değil, ama sütun permütasyonunu değiştirmeyi denediniz mi? "NATURAL" kullandığımda, devasa hızlandırır. Benim için

%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 

, oldukça hızlı splu işlevi çıktı yöntemlerini çözmek kullanma gibi değil, ama o almak oldukça yakın görünüyor (ve splu söylemekten çekiniyor). Belki bu yeterli olur mu? Scipy Docs

İlgili konular