我正在尝试使用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有问题?
答案 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();