def check_4(self,f=f1,per=0,s=0,a=0,b=2*pi,N=20,xb=None,xe=None, ia=0,ib=2*pi,dx=0.2*pi): if xb is None: xb = a if xe is None: xe = b x = a+(b-a)*arange(N+1,dtype=float)/float(N) # nodes x1 = a + (b-a)*arange(1,N,dtype=float)/float(N-1) # middle points of the nodes v, _ = f(x),f(x1) put(" u = %s N = %d" % (repr(round(dx,3)),N)) put(" k : [x(u), %s(x(u))] Error of splprep Error of splrep " % (f(0,None))) for k in range(1,6): tckp,u = splprep([x,v],s=s,per=per,k=k,nest=-1) tck = splrep(x,v,s=s,per=per,k=k) uv = splev(dx,tckp) err1 = abs(uv[1]-f(uv[0])) err2 = abs(splev(uv[0],tck)-f(uv[0])) assert_(err1 < 1e-2) assert_(err2 < 1e-2) put(" %d : %s %.1e %.1e" % (k,repr([round(z,3) for z in uv]), err1, err2)) put("Derivatives of parametric cubic spline at u (first function):") k = 3 tckp,u = splprep([x,v],s=s,per=per,k=k,nest=-1) for d in range(1,k+1): uv = splev(dx,tckp,d) put(" %s " % (repr(uv[0])))
def test_smoke_sproot(self): # sproot is only implemented for k=3 a, b = 0.1, 15 x = np.linspace(a, b, 20) v = np.sin(x) for k in [1, 2, 4, 5]: tck = splrep(x, v, s=0, per=0, k=k, xe=b) with assert_raises(ValueError): sproot(tck) k = 3 tck = splrep(x, v, s=0, k=3) roots = sproot(tck) assert_allclose(splev(roots, tck), 0, atol=1e-10, rtol=1e-10) assert_allclose(roots, np.pi * np.array([1, 2, 3, 4]), rtol=1e-3)
def setup_method(self): # non-uniform grid, just to make it sure x = np.linspace(0, 1, 100)**3 y = np.sin(20 * x) self.spl = splrep(x, y) # double check that knots are non-uniform assert_(np.diff(self.spl[0]).ptp() > 0)
def test_1d_shape(self): x = [1,2,3,4,5] y = [4,5,6,7,8] tck = splrep(x, y) z = splev([1], tck) assert_equal(z.shape, (1,)) z = splev(1, tck) assert_equal(z.shape, ())
def test_spalde_scalar_input(): # Ticket #629 x = np.linspace(0, 10) y = x**3 tck = splrep(x, y, k=3, t=[5]) res = spalde(np.float64(1), tck) des = np.array([1., 3., 6., 6.]) assert_almost_equal(res, des)
def test_2d_shape(self): x = [1, 2, 3, 4, 5] y = [4, 5, 6, 7, 8] tck = splrep(x, y) t = np.array([[1.0, 1.5, 2.0, 2.5], [3.0, 3.5, 4.0, 4.5]]) z = splev(t, tck) z0 = splev(t[0], tck) z1 = splev(t[1], tck) assert_equal(z, np.row_stack((z0, z1)))
def test_extrapolation_modes(self): # test extrapolation modes # * if ext=0, return the extrapolated value. # * if ext=1, return 0 # * if ext=2, raise a ValueError # * if ext=3, return the boundary value. x = [1,2,3] y = [0,2,4] tck = splrep(x, y, k=1) rstl = [[-2, 6], [0, 0], None, [0, 4]] for ext in (0, 1, 3): assert_array_almost_equal(splev([0, 4], tck, ext=ext), rstl[ext]) assert_raises(ValueError, splev, [0, 4], tck, ext=2)
def check_1(self,f=f1,per=0,s=0,a=0,b=2*pi,N=20,at=0,xb=None,xe=None): if xb is None: xb = a if xe is None: xe = b x = a+(b-a)*arange(N+1,dtype=float)/float(N) # nodes x1 = a+(b-a)*arange(1,N,dtype=float)/float(N-1) # middle points of the nodes v = f(x) nk = [] def err_est(k, d): # Assume f has all derivatives < 1 h = 1.0/float(N) tol = 5 * h**(.75*(k-d)) if s > 0: tol += 1e5*s return tol for k in range(1,6): tck = splrep(x,v,s=s,per=per,k=k,xe=xe) if at: t = tck[0][k:-k] else: t = x1 nd = [] for d in range(k+1): tol = err_est(k, d) err = norm2(f(t,d)-splev(t,tck,d)) / norm2(f(t,d)) assert_(err < tol, (k, d, err, tol)) nd.append((err, tol)) nk.append(nd) put("\nf = %s s=S_k(x;t,c) x in [%s, %s] > [%s, %s]" % (f(None), repr(round(xb,3)),repr(round(xe,3)), repr(round(a,3)),repr(round(b,3)))) if at: str = "at knots" else: str = "at the middle of nodes" put(" per=%d s=%s Evaluation %s" % (per,repr(s),str)) put(" k : |f-s|^2 |f'-s'| |f''-.. |f'''-. |f''''- |f'''''") k = 1 for l in nk: put(' %d : ' % k) for r in l: put(' %.1e %.1e' % r) put('\n') k = k+1
def check_3(self,f=f1,per=0,s=0,a=0,b=2*pi,N=20,xb=None,xe=None, ia=0,ib=2*pi,dx=0.2*pi): if xb is None: xb = a if xe is None: xe = b x = a+(b-a)*arange(N+1,dtype=float)/float(N) # nodes v = f(x) put(" k : Roots of s(x) approx %s x in [%s,%s]:" % (f(None),repr(round(a,3)),repr(round(b,3)))) for k in range(1,6): tck = splrep(x, v, s=s, per=per, k=k, xe=xe) if k == 3: roots = sproot(tck) assert_allclose(splev(roots, tck), 0, atol=1e-10, rtol=1e-10) assert_allclose(roots, pi*array([1, 2, 3, 4]), rtol=1e-3) put(' %d : %s' % (k, repr(roots.tolist()))) else: assert_raises(ValueError, sproot, tck)
def check_2(self,f=f1,per=0,s=0,a=0,b=2*pi,N=20,xb=None,xe=None, ia=0,ib=2*pi,dx=0.2*pi): if xb is None: xb = a if xe is None: xe = b x = a+(b-a)*arange(N+1,dtype=float)/float(N) # nodes v = f(x) def err_est(k, d): # Assume f has all derivatives < 1 h = 1.0/float(N) tol = 5 * h**(.75*(k-d)) if s > 0: tol += 1e5*s return tol nk = [] for k in range(1,6): tck = splrep(x,v,s=s,per=per,k=k,xe=xe) nk.append([splint(ia,ib,tck),spalde(dx,tck)]) put("\nf = %s s=S_k(x;t,c) x in [%s, %s] > [%s, %s]" % (f(None), repr(round(xb,3)),repr(round(xe,3)), repr(round(a,3)),repr(round(b,3)))) put(" per=%d s=%s N=%d [a, b] = [%s, %s] dx=%s" % (per,repr(s),N,repr(round(ia,3)),repr(round(ib,3)),repr(round(dx,3)))) put(" k : int(s,[a,b]) Int.Error Rel. error of s^(d)(dx) d = 0, .., k") k = 1 for r in nk: if r[0] < 0: sr = '-' else: sr = ' ' put(" %d %s%.8f %.1e " % (k,sr,abs(r[0]), abs(r[0]-(f(ib,-1)-f(ia,-1))))) d = 0 for dr in r[1]: err = abs(1-dr/f(dx,d)) tol = err_est(k, d) assert_(err < tol, (k, d)) put(" %.1e %.1e" % (err, tol)) d = d+1 put("\n") k = k+1
def test_smoke_splprep_splrep_splev(self, N, k): a, b, dx = 0, 2. * np.pi, 0.2 * np.pi x = np.linspace(a, b, N + 1) # nodes v = np.sin(x) tckp, u = splprep([x, v], s=0, per=0, k=k, nest=-1) uv = splev(dx, tckp) err1 = abs(uv[1] - np.sin(uv[0])) assert err1 < 1e-2 tck = splrep(x, v, s=0, per=0, k=k) err2 = abs(splev(uv[0], tck) - np.sin(uv[0])) assert err2 < 1e-2 # Derivatives of parametric cubic spline at u (first function) if k == 3: tckp, u = splprep([x, v], s=0, per=0, k=k, nest=-1) for d in range(1, k + 1): uv = splev(dx, tckp, d)
def test_splev_der_k(): # regression test for gh-2188: splev(x, tck, der=k) gives garbage or crashes # for x outside of knot range # test case from gh-2188 tck = (np.array([0., 0., 2.5, 2.5]), np.array([-1.56679978, 2.43995873, 0., 0.]), 1) t, c, k = tck x = np.array([-3, 0, 2.5, 3]) # an explicit form of the linear spline assert_allclose(splev(x, tck), c[0] + (c[1] - c[0]) * x / t[2]) assert_allclose(splev(x, tck, 1), (c[1] - c[0]) / t[2]) # now check a random spline vs splder np.random.seed(1234) x = np.sort(np.random.random(30)) y = np.random.random(30) t, c, k = splrep(x, y) x = [t[0] - 1., t[-1] + 1.] tck2 = splder((t, c, k), k) assert_allclose(splev(x, (t, c, k), k), splev(x, tck2))
def check_2(self, per=0, N=20, ia=0, ib=2 * np.pi): a, b, dx = 0, 2 * np.pi, 0.2 * np.pi x = np.linspace(a, b, N + 1) # nodes v = np.sin(x) def err_est(k, d): # Assume f has all derivatives < 1 h = 1.0 / N tol = 5 * h**(.75 * (k - d)) return tol nk = [] for k in range(1, 6): tck = splrep(x, v, s=0, per=per, k=k, xe=b) nk.append([splint(ia, ib, tck), spalde(dx, tck)]) k = 1 for r in nk: d = 0 for dr in r[1]: tol = err_est(k, d) assert_allclose(dr, f1(dx, d), atol=0, rtol=tol) d = d + 1 k = k + 1
def check_1(self, per=0, s=0, a=0, b=2 * np.pi, at_nodes=False, xb=None, xe=None): if xb is None: xb = a if xe is None: xe = b N = 20 # nodes and middle points of the nodes x = np.linspace(a, b, N + 1) x1 = a + (b - a) * np.arange(1, N, dtype=float) / float(N - 1) v = f1(x) def err_est(k, d): # Assume f has all derivatives < 1 h = 1.0 / N tol = 5 * h**(.75 * (k - d)) if s > 0: tol += 1e5 * s return tol for k in range(1, 6): tck = splrep(x, v, s=s, per=per, k=k, xe=xe) tt = tck[0][k:-k] if at_nodes else x1 nd = [] for d in range(k + 1): tol = err_est(k, d) err = norm2(f1(tt, d) - splev(tt, tck, d)) / norm2(f1(tt, d)) assert err < tol