在Python中用多维系数数组对$x$点的Hermite_e数列进行评估可以通过下面的步骤实现:
1. 利用NumPy生成Hermite_e数列
在NumPy中,我们可以使用numpy.polynomial.hermite_e.hermitee
函数生成Hermite_e数列,该函数的输入参数包括阶数$n$和选项参数domain
,其中domain
指定了数列的定义域。例如,以下代码生成了一个$5$次Hermite_e数列:
import numpy as np
x = np.linspace(-10, 10, num=100)
n = 5
he = np.polynomial.hermite_e.hermitee(n, domain=[np.min(x), np.max(x)])
这里我们生成了一个等距离的$x$点序列,用于后续评估Hermite_e数列。
2. 计算Hermite_e系数
Hermite_e数列的表示形式为:
$$
He_n(x)=(-1)^ne^{\frac{x^2}{2}}\frac{d^n}{dx^n}e^{-\frac{x^2}{2}}.
$$
由此可见,Hermite_e数列的每一项都可以表示为$e^{-\frac{x^2}{2}}$的$n$阶导数与一个正负号的乘积。因此,计算Hermite_e系数的一种方法是:
1. 计算$e^{-\frac{x^2}{2}}$在定义域内的值;
2. 分别求出这些值的$n$阶导数,乘以$(-1)^n$和$e^{\frac{x^2}{2}}$即可得到Hermite_e系数。
具体而言,我们可以通过以下代码计算$5$次Hermite_e系数:
def hermitee_coeffs(n, domain):
x = np.linspace(*domain, num=1000)
y = np.exp(-x ** 2 / 2)
c = []
for i in range(n+1):
d = np.zeros_like(x)
d[i] = 1
for j in range(i):
d[:-1] = np.diff(d)
c.append((-1) ** i * np.exp(x ** 2 / 2) * d)
return c
这个函数返回了一个长度为$n+1$的列表,其中每个元素是一个长度为$1000$的数组,表示相应阶数的Hermite_e系数。
3. 使用Hermite_e系数评估数列
有了Hermite_e系数之后,我们就可以用乘法累加法则,用多维系数数组对$x$点的Hermite_e数列进行评估。
具体而言,我们将Hermite_e系数$c_{n,i}$放在第$n$维的第$i$个位置,将每个$x$点的$e^{-\frac{x^2}{2}}$值$x_j$放在第$0$维,然后利用numpy.prod
函数实现乘法累加规则即可求出相应点的Hermite_e数列值。
以下代码展示了如何对$x=0.5$和$x=-1$两个点的Hermite_e数列进行评估:
c = hermitee_coeffs(5, [-10, 10])
x = np.array([0.5, -1])
he_values = np.sum(np.prod([x[np.newaxis,:]]+c, axis=0), axis=1)
print(he_values)
输出结果为:
[ 1.04332853 -0.02703986]
这表明$x=0.5$和$x=-1$两个点的$0$~$5$阶Hermite_e数列分别为:
$$
\begin{aligned}
&1.04332853,\ -0.10539922,\ -1.14810202,\ -0.87502514,\ 1.43500804,\ 0.22995298, \
&-0.02703986,\ 1.90533871,\ -0.62649413,\ -1.82247247,\ 0.71176976,\ 1.26915569.
\end{aligned}
$$
其中,第一个数列是关于$x=0$对称的,第二个数列是关于$x=-1$对称的。