Interpolate.splrep 返回 "nans"

Interpolate.splrep returning "nans"

我正在尝试使用 scipy 对具有三次样条的简单函数进行插值。我有使用 0.0001 space 网格的说明(因此是 v 的设计)并均匀使用 5 个 spaced 结。

def h(x):
    if -2 < x < 0:
        return (x+0.5)**2
    elif 0 < x < 2:
        return (x-0.5)**2

h = np.vectorize(h)

v = np.linspace(-2,2,num=40000)
knots = np.linspace(-1.999, 1.9999, 5)
tck_h = interpolate.splrep(v, h(v), t=knots)
result_ip_h = interpolate.splev(v, tck_h)

然而,tck(interpolate.splrep 返回的元组)似乎返回了更多的结(一些重复)和几个 "nans" 系数:

(array([-2.000000e+00, -2.000000e+00, -2.000000e+00, -2.000000e+00,
        -1.999000e+00, -9.992750e-01,  4.500000e-04,  1.000175e+00,
         1.999900e+00,  2.000000e+00,  2.000000e+00,  2.000000e+00,
         2.000000e+00]),
 array([nan, nan, nan, nan, nan, nan, nan, nan, nan,  0.,  0.,  0.,  0.]),
 3)

我认为 x 处的 40000 点可能太多了,但减少它不是问题。可能是函数h的问题?

我修改了h函数的实现。问题似乎是函数没有在任何地方定义,因此返回 NaN 值(实际上是 None 值)...

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

def h(x):
    if x < 0:
        return (x+0.5)**2
    else:
        return (x-0.5)**2

h = np.vectorize(h)

v = np.linspace(-2, 2, num=500)


knots = np.linspace(-1.999, 1.999, 5)
tck_h = interpolate.splrep(v, h(v), t=knots)
result_ip_h = interpolate.splev(v, tck_h)

plt.plot(v, h(v), label='h');
plt.plot(v, result_ip_h, label='spline'); plt.legend();