所以我正在为我的数值课程编写一个python程序,我必须编写一个三次样条程序。因此,我实现了Chapra和canale的《数值方法》以及chenny和kincaid的《数值数学》等书中给出的三次样条公式。
所以我的数据是
x=[1.0,3.0,4.0,7.0]
y=[1.5,4.5,9.0,25.5]
使用此数据并应用我得到的三次样条x=1.5
,y=1.79122340426
使用相同的数据但使用 scipy 函数时,可以得到:
>>> scipy.interpolate.interp1d(x, y, kind='cubic')(1.5)
array(1.265624999999932)
那么,为什么结果会有所不同呢?很明显,他们没有使用相同的公式。该 scipy 函数中使用的三次样条公式是什么?它是自然的三次样条公式还是改进的东西?注意:值 1.2656 更准确。
编辑:@ev-br 在此答案的评论中对我的答案进行了重要的更正。事实上,interp1D 样条并不是基于 FITPACK 的。检查评论中@ev-br提供的链接。
用于曲线拟合的 Scipy 函数基于 FITPACK。尝试查看有关您正在使用的函数的文档,您将能够看到"参考"一章,其中将出现类似以下内容:
Notes
-----
See splev for evaluation of the spline and its derivatives. Uses the
FORTRAN routine curfit from FITPACK.
If provided, knots `t` must satisfy the Schoenberg-Whitney conditions,
i.e., there must be a subset of data points ``x[j]`` such that
``t[j] < x[j] < t[j+k+1]``, for ``j=0, 1,...,n-k-2``.
References
----------
Based on algorithms described in [1]_, [2]_, [3]_, and [4]_:
.. [1] P. Dierckx, "An algorithm for smoothing, differentiation and
integration of experimental data using spline functions",
J.Comp.Appl.Maths 1 (1975) 165-184.
.. [2] P. Dierckx, "A fast algorithm for smoothing data on a rectangular
grid while using spline functions", SIAM J.Numer.Anal. 19 (1982)
1286-1304.
.. [3] P. Dierckx, "An improved algorithm for curve fitting with spline
functions", report tw54, Dept. Computer Science,K.U. Leuven, 1981.
.. [4] P. Dierckx, "Curve and surface fitting with splines", Monographs on
Numerical Analysis, Oxford University Press, 1993.
这些引用尤其取自 fitpack.py 关于函数"splrep"的来源。如果您需要在算法和interp1D的样条之间进行非常彻底的比较,请转到文档:
scipy.interpolate.interp1d
你会在函数名称的定义之后看到一个名为[source]的链接(所以:scipy.interpolate.interp1D [source])。请记住,这些函数上有很多例程处理程序,因此在导航源时请耐心等待。