gpt4 book ai didi

python - 使用指定节点插值 interpolate.splrep — 意外结果

转载 作者:行者123 更新时间:2023-11-28 19:20:02 25 4
gpt4 key购买 nike

我不明白 interpolate.splrep 函数是如何工作的。简单的代码不会抛出任何错误,但 interpolate.splev 会返回意外结果。

degree = 4;
arg = np.linspace(0, 2.0 * np.pi, 1000);
val = np.sin(arg);

m = arg.size - degree - 1;
step = (arg[-1] - arg[0]) / (m + 1);
knots = np.linspace(step, m * step, m);

f = interpolate.splrep(arg, val, k=degree, s=0, t=knots, per=0);

x = 0.123456;
print interpolate.splev(x, f) - np.sin(x);

此代码打印 2.81341438303e+118,但如果我更改参数 per,代码运行良好:

...
f = interpolate.splrep(arg, val, k=degree, s=0, t=knots, per=1);
...

结果是 -1.80411241502e-16。你能解释一下结果吗?不是bug吗?

最佳答案

参数 per 切换周期性边界条件 (pbc)。似乎没有 pbc 拟合不会收敛,但是有 pbc 就可以了。您还可以在绘制数据和样条拟合结果时看到:它只会在边界处发散,数据集的其余部分拟合得很好!

documentation of the function interpolate.splrep说明具有偶数度的组合不是一个好主意。您有 degree = 4(偶数)和 s = 0

看来你定义了很多结! B 样条是分段拟合。如果你有很多结,每个样条函数将只对非常小的一部分点有效。您有 1000 个横坐标点和 995 海里/小时。样条必须适用的点越少,函数的自由度就越大,因此如果您需要的点很少,样条几乎可以是任何东西...

将行 m = arg.size - degree - 1; 更改为 m = arg.size - degree - 20; 已经产生

>>> print interpolate.splev(x, f) - np.sin(x);
3.08053624276e-10

没有 pbc!

所以,问问自己为什么要这样计算结数!要么你坚持使用它并引入 pbc,即 per=1,要么你稍微减少结的数量。两者都将稳定拟合并实现收敛!

关于python - 使用指定节点插值 interpolate.splrep — 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com