我编写了一个用 B 样条插值的例程,后来才发现这个功能已经包含在 Python 的 SciPy 中。
但是,我不理解 SciPy 模块(UnivariateSpline)[ http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html#scipy.interpolate.UnivariateSpline]中的一个参数。我不明白的参数是参数 s,这是一个
用于选择结数的正平滑因子。如果无(默认),s=len(w)(w 是权重数组)。如果 s=0,样条将插入所有数据点。
下面我包括了两个图,插值的势能曲线分子,s=None 的顶部图, s=0 的底部图。我本来期望相反。这可能是由于我对B 样条中的结的理解。谁能向我解释一下,结是如何在 SciPy 的单变量例程中实现的(简而言之,我可以自己浏览源代码,但这不是重点)。
这是代码,您需要下载此数据文件并将其命名为“*BO_energy.txt”才能运行它:
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import UnivariateSpline
krange=[1,5]
data = np.genfromtxt("BO_energy.txt")
x = data[:,0]
V = data[:,1]
mk = [ "-.ks", "k-.+", "b--.", "k-.,", "b--*", "k--", "ro", "ro"]
#plot for s = None
plt.figure(1)
plt.plot(x, V, 'r--o', label="BO")
for i in range(krange[0],krange[1]):
spline = UnivariateSpline(x,V,k=i)
plt.plot(x,spline(x),mk[i], label="k=%d"%i)
plt.legend()
plt.title("SciPy: Univariate Splines for various k and s=None")
plt.xlabel("x / $a_0$")
plt.ylabel("V(x) / Hartree")
plt.savefig("../01.png")
#plot for s = 0
plt.figure(2)
plt.plot(x, V, 'r--o', label="BO")
for i in range(krange[0],krange[1]):
spline = UnivariateSpline(x,V,k=i,s=0)
plt.plot(x,spline(x),mk[i], label="k=%d"%i)
plt.legend()
plt.title("SciPy: Univariate Splines for various k and s=0")
plt.xlabel("x / $a_0$")
plt.ylabel("V(x) / Hartree")
plt.savefig("../02.png")
plt.show()