获取 Hermite 插值多项式的根

计算科学 Python 插值 scipy
2021-11-29 23:54:28

我正在使用 Python 3.7 编写一个程序,该程序需要我计算 Hermite 插值多项式的根,给定两点ϵ0,ϵ1, 功能 (d(ϵ0),d(ϵ1)) 和导数值 (d(ϵ1),d(ϵ1)) 在这些点上。我正在使用 Scipy v1.3.0 并使用 scipy.interpolate 库中的 CubicHermiteSpline 函数。代码的相关摘录是:

import numpy as np
from scipy.interpolate import BPoly,CubicHermiteSpline

#somewhere below inside a while loop with a counter variable k is this part

r=CubicHermiteSpline(eps[k-1:k+1],abs(l[k-1:k+1]), d1[k-1:k+1]).roots()
epsk=(np.abs(r - eps[k])).argmin()

其中abs(l)包含多项式的值并d1包含导数值。问题是 .roots() 为间隔返回一个空数组(ϵ0,ϵ1)。

ValueError: attempt to get argmin of an empty sequence

这是因为该区间的插值多项​​式如下所示: 在此处输入图像描述

如何获得插值多项式的所有三个根,这可能不一定在区间内?

编辑:数值:

d(ϵ0)=1.00000188d(ϵ1)=1.09393556d(ϵ0)=4.30116854d(ϵ1)=4.30428889
求 Hermite 插值多项式的根。插值多项式图: 在此处输入图像描述

1个回答

插值多项式没有根考虑到插值区域外的行为成立,称为外插。

您可以显式使用由(正如我在这篇文章中解释的)给出的多项式

f(x)N1(x)u1+N2(x)u2+|J|(N3(x)u1+N4(x)u2)x[a,b]

|J|=(ba)/2变换的雅可比行列式,并且,对于a=1,b=1,

N1(x)=14(x1)2(2+x)N2(x)=14(x+1)2(2x)N3(x)=14(x1)2(x+1)N4(x)=14(x+1)2(x1).

然后,您可以使用三次方程的一般公式或使用像 Newton-Raphson 这样的方法。