1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
#!/usr/bin/env python
# Created by Pearu Peterson, June 2003
# Modified by John Travers, October 2006
""" Test functions for spline.spline module
"""
__usage__ = """
Build spline:
python setup_spline.py build
Run tests if scipy is installed:
python -c 'import scipy;scipy.spline.test(<level>)'
Run tests if spline is not installed:
python tests/test_spline.py [<level>]
"""
import sys
from numpy.testing import *
from numpy import array, arange, around, pi, sin, cos
set_package_path()
from spline.spline import UnivariateSpline,LSQUnivariateSpline,\
InterpolatedUnivariateSpline
from spline.spline import LSQBivariateSpline, SmoothBivariateSpline,\
RectBivariateSpline
restore_path()
set_local_path()
from dierckx_test_data import *
restore_path()
class test_UnivariateSpline(NumpyTestCase):
def check_linear_constant(self):
x = [1,2,3]
y = [3,3,3]
lut = UnivariateSpline(x,y,k=1)
assert_array_almost_equal(lut.get_knots(),[1,3])
assert_array_almost_equal(lut.get_coeffs(),[3,3])
assert_almost_equal(lut.get_residual(),0.0)
assert_array_almost_equal(lut([1,1.5,2]),[3,3,3])
def check_linear_1d(self):
x = [1,2,3]
y = [0,2,4]
lut = UnivariateSpline(x,y,k=1)
assert_array_almost_equal(lut.get_knots(),[1,3])
assert_array_almost_equal(lut.get_coeffs(),[0,4])
assert_almost_equal(lut.get_residual(),0.0)
assert_array_almost_equal(lut([1,1.5,2]),[0,1,2])
def check_curfit_against_dierckx(self):
""" Test against results obtined from the pure fortran routines.
Here we check simple spline creation and evaluation.
"""
x,y = curfit_test['x'],curfit_test['y']
k,s = curfit_test_smth['k'],curfit_test_smth['s']
iopt = curfit_test_smth['iopt']
for i in range(len(k)):
if iopt[i] == 0:
uspl = UnivariateSpline(x,y,k=k[i],s=s[i])
elif iopt[i] == 1:
uspl.set_smoothing_factor(s[i])
assert_almost_equal(uspl.get_residual(),
curfit_test_smth['fp'][i], decimal=2)
n = uspl._data[7]
assert_equal(n,curfit_test_smth['n'][i])
assert_array_almost_equal(around(uspl.get_knots(),1),
curfit_test_smth['t'][i][k[i]:n-k[i]])
assert_array_almost_equal(around(uspl.get_coeffs(),4),
curfit_test_smth['c'][i], decimal=3)
assert_array_almost_equal(around(uspl(x),1),
curfit_test_smth['sp'][i])
def check_spint_spalde(self):
per = [0, 0, 0]
N = [20, 20, 50]
ia = [0, 0, 0.2*pi]
ib = [0, 0, pi]
a,b = 0,2*pi
dx = 0.2*pi
k = range(1,6)
for i in range(len(per)):
x=a+(b-a)*arange(N[i]+1,dtype=float)/float(N[i])
v=f1(x)
for j in range(len(k)):
uspl = UnivariateSpline(x,v,k=k[j],s=0)
ir = uspl.integral(ia[i],ib[i])
dr = uspl.derivatives(dx)
assert_almost_equal(ir, f1(ib[i],-1)-f1(ia[i],-1), decimal=2)
d=0
for ddr in dr:
if d<k[j]-1:
assert_almost_equal(1, ddr/f1(dx,d), decimal=2)
d=d+1
def check_sproot(self):
a=0
b=15
N=20
x=a+(b-a)*arange(N+1,dtype=float)/float(N)
v=f1(x)
k=3
uspl = UnivariateSpline(x,v,k=k,s=0)
ex = array([0.0, pi, 2.0*pi, 3.0*pi, 4.0*pi])
assert_array_almost_equal(uspl.roots(),ex, decimal=3)
class test_LSQUnivariateSpline(NumpyTestCase):
def check_curfit_against_dierckx(self):
""" Test against results obtined from the pure fortran routines.
Here we check simple spline creation and evaluation.
"""
x,y = curfit_test['x'],curfit_test['y']
k = curfit_test_lsq['k']
for i in range(len(k)):
t = curfit_test_lsq['t'][i]
lsquspl = LSQUnivariateSpline(x,y,t,k=k[i])
assert_almost_equal(lsquspl.get_residual(),
curfit_test_lsq['fp'][i], decimal=2)
assert_array_almost_equal(around(lsquspl.get_coeffs(),4),
curfit_test_lsq['c'][i], decimal=3)
assert_array_almost_equal(around(lsquspl(x),1),
curfit_test_lsq['sp'][i])
class test_LSQBivariateSpline(NumpyTestCase):
def check_linear_constant(self):
x = [1,1,1,2,2,2,3,3,3]
y = [1,2,3,1,2,3,1,2,3]
z = [3,3,3,3,3,3,3,3,3]
s = 0.1
tx = [1+s,3-s]
ty = [1+s,3-s]
lut = LSQBivariateSpline(x,y,z,tx,ty,kx=1,ky=1)
#print lut.get_knots()
#print lut.get_coeffs()
#print lut.get_residual()
class test_SmoothBivariateSpline(NumpyTestCase):
def check_linear_constant(self):
x = [1,1,1,2,2,2,3,3,3]
y = [1,2,3,1,2,3,1,2,3]
z = [3,3,3,3,3,3,3,3,3]
lut = SmoothBivariateSpline(x,y,z,kx=1,ky=1)
assert_array_almost_equal(lut.get_knots(),([1,1,3,3],[1,1,3,3]))
assert_array_almost_equal(lut.get_coeffs(),[3,3,3,3])
assert_almost_equal(lut.get_residual(),0.0)
assert_array_almost_equal(lut([1,1.5,2],[1,1.5]),[[3,3],[3,3],[3,3]])
def check_linear_1d(self):
x = [1,1,1,2,2,2,3,3,3]
y = [1,2,3,1,2,3,1,2,3]
z = [0,0,0,2,2,2,4,4,4]
lut = SmoothBivariateSpline(x,y,z,kx=1,ky=1)
assert_array_almost_equal(lut.get_knots(),([1,1,3,3],[1,1,3,3]))
assert_array_almost_equal(lut.get_coeffs(),[0,0,4,4])
assert_almost_equal(lut.get_residual(),0.0)
assert_array_almost_equal(lut([1,1.5,2],[1,1.5]),[[0,0],[1,1],[2,2]])
class test_RectBivariateSpline(NumpyTestCase):
def check_defaults(self):
x = array([1,2,3,4,5])
y = array([1,2,3,4,5])
z = array([[1,2,1,2,1],[1,2,1,2,1],[1,2,3,2,1],[1,2,2,2,1],[1,2,1,2,1]])
lut = RectBivariateSpline(x,y,z)
assert_array_almost_equal(lut(x,y),z)
if __name__ == "__main__":
NumpyTest().run()
|