[Scipy-svn] r3891 - trunk/scipy/splinalg/isolve/tests
scipy-svn at scipy.org
scipy-svn at scipy.org
Sat Feb 2 14:30:45 EST 2008
Author: wnbell
Date: 2008-02-02 13:30:41 -0600 (Sat, 02 Feb 2008)
New Revision: 3891
Modified:
trunk/scipy/splinalg/isolve/tests/test_iterative.py
Log:
add more interesting QMR test
Modified: trunk/scipy/splinalg/isolve/tests/test_iterative.py
===================================================================
--- trunk/scipy/splinalg/isolve/tests/test_iterative.py 2008-02-02 18:17:25 UTC (rev 3890)
+++ trunk/scipy/splinalg/isolve/tests/test_iterative.py 2008-02-02 19:30:41 UTC (rev 3891)
@@ -112,5 +112,42 @@
assert( norm(b - A*x) < tol*norm(b) )
+class TestQMR(TestCase):
+ def test_leftright_precond(self):
+ """Check that QMR works with left and right preconditioners"""
+
+ from scipy.splinalg.dsolve import splu
+ from scipy.splinalg.interface import LinearOperator
+
+ n = 100
+
+ dat = ones(n)
+ A = spdiags([-2*dat, 4*dat, -dat], [-1,0,1] ,n,n)
+ b = arange(n,dtype='d')
+
+ L = spdiags([-dat/2, dat], [-1,0], n, n)
+ U = spdiags([4*dat, -dat], [ 0,1], n, n)
+
+ L_solver = splu(L)
+ U_solver = splu(U)
+
+ def L_solve(b):
+ return L_solver.solve(b)
+ def U_solve(b):
+ return U_solver.solve(b)
+ def LT_solve(b):
+ return L_solver.solve(b,'T')
+ def UT_solve(b):
+ return U_solver.solve(b,'T')
+
+ M1 = LinearOperator( (n,n), matvec=L_solve, rmatvec=LT_solve )
+ M2 = LinearOperator( (n,n), matvec=U_solve, rmatvec=UT_solve )
+
+ x,info = qmr(A, b, tol=1e-8, maxiter=15, M1=M1, M2=M2)
+
+ assert_equal(info,0)
+ assert( norm(b - A*x) < 1e-8*norm(b) )
+
+
if __name__ == "__main__":
nose.run(argv=['', __file__])
More information about the Scipy-svn
mailing list