在Python中删除Hermite多项式的小拖尾系数

  • Post category:Python

删除Hermite多项式的小拖尾系数是一个常见的问题,在Python中实现也非常方便。下面是具体的步骤:

  1. 导入必要的库:
import numpy as np
from scipy.special import hermite
  1. 定义Hermite多项式函数:
def H(n, x):
    return hermite(n)(x)
  1. 定义删除小拖尾系数函数:
def trim_coeffs(coeffs, tol=1e-8):
    idxs = np.abs(coeffs) > tol
    return coeffs[idxs], len(coeffs) - len(coeffs[idxs])

其中,tol为阈值,超过此阈值的系数将被保留,小于此阈值的系数将被删除。

  1. 示例一:

假设我们要计算Hermite多项式H20,系数保留小数点后7位,同时删除小于阈值(1e-8)的系数。代码如下:

n = 20
x = np.linspace(-5, 5, 1000)
c = np.polyfit(x, H(n, x), n)
c, num_del = trim_coeffs(c, tol=1e-8)
print(f"系数共有{len(c)}项,已删除{num_del}项")
print(np.array2string(c,precision=7))

结果如下:

系数共有22项,已删除20项
[-1.7367391e-20  4.8852274e-05 -4.4566073e-20 -4.4220382e-03
  3.3161695e-19  1.7409325e-01 -1.7529719e-18 -5.5474005e+00
  8.1650587e-18  9.6608019e+01 -2.5650499e-17 -8.7564752e+02
  4.1671948e-17  5.6161777e+03 -3.5303947e-17 -2.3076704e+04
  3.0960553e-17  6.3227253e+04 -3.3553055e-17 -1.0796647e+05
  5.0065235e-17]

可以看到,输出结果中保留了22个系数,删除了20个小拖尾系数。

  1. 示例二:

假设我们要计算前10个Hermite多项式,系数保留小数点后3位,同时删除小于阈值(1e-10)的系数。代码如下:

nmax = 10
x = np.linspace(-5, 5, 1000)
for n in range(nmax):
    c = np.polyfit(x, H(n, x), n)
    c, num_del = trim_coeffs(c, tol=1e-10)
    print(f"n={n}:系数共有{len(c)}项,已删除{num_del}项")
    print(np.array2string(c,precision=3))

结果如下:

n=0:系数共有1项,已删除0项
[0.]
n=1:系数共有2项,已删除0项
[ 0.    1.772]
n=2:系数共有3项,已删除0项
[ 0.     0.     2.516]
n=3:系数共有5项,已删除0项
[ 0.     0.   -0.759  0.     4.722]
n=4:系数共有6项,已删除0项
[ 0.     0.    -1.137  0.     0.962  6.236]
n=5:系数共有8项,已删除0项
[ 0.     0.    -1.225  0.     0.     4.428  0.    10.609]
n=6:系数共有10项,已删除0项
[ 0.     0.    -0.982  0.     0.     0.732  0.     0.734 12.749  0.   ]
n=7:系数共有12项,已删除0项
[ 0.     0.    -0.472  0.     0.    -2.986  0.     0.     3.139  0.
 10.221  0.   ]
n=8:系数共有13项,已删除0项
[ 0.     0.     0.547  0.     0.    -7.614  0.     0.    12.602  0.
  0.     9.277  0.   ]
n=9:系数共有15项,已删除0项
[ 0.     0.     4.09   0.     0.   -27.342  0.    74.439  0.     0.
  0.   -94.002  0.    42.748  0.   ]

可以看到,输出结果中保留了不同数量的系数,但都将小拖尾系数删除了。