[Scipy-svn] r3182 - in trunk/Lib/linalg: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Mon Jul 23 08:07:04 EDT 2007


Author: cdavid
Date: 2007-07-23 07:06:57 -0500 (Mon, 23 Jul 2007)
New Revision: 3182

Modified:
   trunk/Lib/linalg/decomp.py
   trunk/Lib/linalg/tests/test_decomp.py
Log:
Handle Nan eigenvalues in _make_complex_eigvecs, should close #224

Modified: trunk/Lib/linalg/decomp.py
===================================================================
--- trunk/Lib/linalg/decomp.py	2007-07-23 07:33:16 UTC (rev 3181)
+++ trunk/Lib/linalg/decomp.py	2007-07-23 12:06:57 UTC (rev 3182)
@@ -32,7 +32,9 @@
 _I = cast['F'](1j)
 def _make_complex_eigvecs(w,vin,cmplx_tcode):
     v = numpy.array(vin,dtype=cmplx_tcode)
-    ind = numpy.flatnonzero(numpy.not_equal(w.imag,0.0))
+    #ind = numpy.flatnonzero(numpy.not_equal(w.imag,0.0))
+    ind = numpy.flatnonzero(numpy.logical_and(numpy.not_equal(w.imag,0.0),
+                            numpy.isfinite(w)))
     vnew = numpy.zeros((v.shape[0],len(ind)>>1),cmplx_tcode)
     vnew.real = numpy.take(vin,ind[::2],1)
     vnew.imag = numpy.take(vin,ind[1::2],1)

Modified: trunk/Lib/linalg/tests/test_decomp.py
===================================================================
--- trunk/Lib/linalg/tests/test_decomp.py	2007-07-23 07:33:16 UTC (rev 3181)
+++ trunk/Lib/linalg/tests/test_decomp.py	2007-07-23 12:06:57 UTC (rev 3182)
@@ -109,8 +109,47 @@
             assert_array_almost_equal(dot(conjugate(transpose(a)),vl[:,i]),
                                       conjugate(w[i])*vl[:,i])
 
+    def test_singular(self):
+        """Test singular pair"""
+        # Example taken from
+        # http://www.cs.umu.se/research/nla/singular_pairs/guptri/matlab.html
+        A = array(( [22,34,31,31,17], [45,45,42,19,29], [39,47,49,26,34],
+            [27,31,26,21,15], [38,44,44,24,30]))
 
+        B = array(( [13,26,25,17,24], [31,46,40,26,37], [26,40,19,25,25],
+            [16,25,27,14,23], [24,35,18,21,22]))
 
+        w, vr = eig(A,B)
+        wt = eigvals(A,B)
+        val1 = dot(A, vr)
+        val2 = dot(B, vr) * w
+        res = val1 - val2
+        for i in range(res.shape[1]):
+            if all(isfinite(res[:, i])):
+                assert_array_almost_equal(res[:, i], 0)
+        
+        assert_array_almost_equal(w[isfinite(w)], wt[isfinite(w)])
+
+    def test_falker(self):
+        """Test matrices giving some Nan generalized eigen values."""
+        M = diag(array(([1,0,3])))
+        K = array(([2,-1,-1],[-1,2,-1],[-1,-1,2]))
+        D = array(([1,-1,0],[-1,1,0],[0,0,0]))
+        Z = zeros((3,3))
+        I = identity(3)
+        A = bmat([[I,Z],[Z,-K]])
+        B = bmat([[Z,I],[M,D]])
+        A = asarray(A)
+        B = asarray(B)
+
+        w, vr = eig(A,B)
+        val1 = dot(A, vr)
+        val2 = dot(B, vr) * w
+        res = val1 - val2
+        for i in range(res.shape[1]):
+            if all(isfinite(res[:, i])):
+                assert_array_almost_equal(res[:, i], 0)
+
 class test_eig_banded(NumpyTestCase):
 
     def __init__(self, *args):




More information about the Scipy-svn mailing list