[Scipy-svn] r3005 - trunk/Lib/interpolate

scipy-svn at scipy.org scipy-svn at scipy.org
Tue May 15 07:31:53 EDT 2007


Author: oliphant
Date: 2007-05-15 06:31:51 -0500 (Tue, 15 May 2007)
New Revision: 3005

Modified:
   trunk/Lib/interpolate/interpolate.py
Log:
Start to use banded solver in cubic spline implementation.

Modified: trunk/Lib/interpolate/interpolate.py
===================================================================
--- trunk/Lib/interpolate/interpolate.py	2007-05-15 11:18:19 UTC (rev 3004)
+++ trunk/Lib/interpolate/interpolate.py	2007-05-15 11:31:51 UTC (rev 3005)
@@ -356,8 +356,9 @@
     Np1 = len(xk)
     dk = xk[1:]-xk[:-1]
     if kind == 'not-a-knot':
+        # use banded-solver
         nlu = (1,1)
-        B = np.ones((3,Np1))
+        B = ones((3,Np1))
         alpha = 2*(yk[1:]-yk[:-1])/dk
         zrs = np.zeros((1,)+yk.shape[1:])
         row = (Np1-1)//2
@@ -383,9 +384,14 @@
             m0, mN = conds
 
         # the matrix to invert is (N-1,N-1)
+        # use banded solver
         beta = 2*(xk[2:]-xk[:-2])
         alpha = xk[1:]-xk[:-1]
-        B = np.diag(alpha[1:-1],k=-1) + np.diag(beta) + np.diag(alpha[2:],k=1)
+        nlu = (1,1)
+        B = np.empty((3,Np1-2))
+        B[0,1:] = alpha[2:]
+        B[1,:] = beta
+        B[2,:-1] = alpha[1:-1]
         dyk = yk[1:]-yk[:-1]
         b = (dyk[1:]/alpha[1:] - dyk[:-1]/alpha[:-1])
         b *= 6
@@ -395,17 +401,17 @@
         def append_func(mk):
             # put m0 and mN into the correct shape for
             #  concatenation
-            m0 = array(m0,copy=0,ndmin=yk.ndim)
-            mN = array(mN,copy=0,ndmin=yk.ndim)
-            if m0.shape[1:] != yk.shape[1:]:
-                m0 = m0*(ones(yk.shape[1:])[newaxis,...])
-            if mN.shape[1:] != yk.shape[1:]:
-                mN = mN*(ones(yk.shape[1:])[newaxis,...])
-            mk = concatenate((m0,mk),axis=0)
-            mk = concatenate((mk,mN),axis=0)
+            ma = array(m0,copy=0,ndmin=yk.ndim)
+            mb = array(mN,copy=0,ndmin=yk.ndim)
+            if ma.shape[1:] != yk.shape[1:]:
+                ma = ma*(ones(yk.shape[1:])[np.newaxis,...])
+            if mb.shape[1:] != yk.shape[1:]:
+                mb = mb*(ones(yk.shape[1:])[np.newaxis,...])
+            mk = np.concatenate((ma,mk),axis=0)
+            mk = np.concatenate((mk,mb),axis=0)
             return mk
 
-        return B, b, append_func, None
+        return B, b, append_func, nlu
 
 
     elif kind in ['clamped', 'endslope', 'first', 'not-a-knot', 'runout',




More information about the Scipy-svn mailing list