在Python中用多维系数数组对x点的Hermite_e数列进行评估

  • Post category:Python

在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$对称的。