Interpolate.splrep返回“ nans”

时间:2018-08-12 15:46:25

标签: python scipy interpolation

我正在尝试使用scipy用三次样条插值一个简单函数。我有使用0.0001空间网格(因此是 v 的设计)并使用5个均匀间隔的结的指令。

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返回的元组)似乎同时返回了更多的结(有些重复)和几个“难”系数:

(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有问题?

1 个答案:

答案 0 :(得分:0)

我修改了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();