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ı?
'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
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 –
Üç 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