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();
我正在尝试使用 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();