Python之Hermite多项式

Hermite多项式

Hermite多项式是一种非常重要的正交多项式,尤其在量子力学中,是谐振子的本征态,在物理学中,其定义为

H n ( x ) = ( − 1 ) n e x 2 d n d x n e − x 2 H_n(x)=(-1)^ne^{x^2}\frac{\text d^n}{\text dx^n}e^{-x^2} Hn(x)=(1)nex2dxndnex2

其中 n n n为厄密特多项式的阶数,在Python中,提供了Hermite类,构造函数为

numpy.polynomial.hermite.Hermite(coef, domain=None, window=None, symbol='x')

其中coef为系数列表 a 0 , a 1 , ⋯   , a n a_0, a_1,\cdots,a_n a0,a1,,an,表示生成

∑ i = 0 n a i H i ( x ) \sum_{i=0}^n a_iH_i(x) i=0naiHi(x)

domain表示 x x x的定义域,window表示缩放系数。

from numpy.polynomial.hermite import Hermite
h3 = Hermite(coef=[4,3,2,1])
print(h3)
# 输出为4.0 + 3.0 H_1(x) + 2.0 H_2(x) + 1.0 H_3(x)

为了便于理解Hermite多项式到底是个啥,可以绘制一下不同阶数的Hermite多项式的函数

import matplotlib.pyplot as plt
for i in range(5):
    c = np.zeros(i+1)
    c[i] = 1
    h = Hermite(coef=c, domain=(-5,5))
    xs, ys = h.linspace()
    plt.plot(xs, ys, label=str(i))

plt.legend()
plt.show()

其中h.linspace表示在定义域范围内对多项式进行采样,有一个参数n,表示在定义域范围内等间隔生成n x , y x,y x,y,默认为100。

得图如下

在这里插入图片描述

求导和积分

Hermite支持简单的符号计算,比如可通过deriv(n)求多项式的n阶导数;通过integ(n)可求n阶积分,示例如下

>>> h3.deriv(1)
Hermite([6., 8., 6.], domain=[-1.,  1.], window=[-1.,  1.])
>>> h3.deriv(3)
Hermite([48.], domain=[-1.,  1.], window=[-1.,  1.])
>>> h3.integ(2)
Hermite([0.5       , 0.        , 0.5       , 0.125     , 0.04166667, 0.0125    ], domain=[-1.,  1.], window=[-1.,  1.])

求导后得到的系数可通过递推关系验证,

H n ′ ( x ) = 2 n H n − 1 ( x ) H_{n}'(x) = 2nH_{n-1}(x) Hn(x)=2nHn1(x)

所以 H 3 ′ ( x ) = 6 H 2 ′ ( x ) H_3'(x)=6H_2'(x) H3(x)=6H2(x),即上述计算是没毛病的。

求根和反演

roots可用于求根,而fromroot可根据根来生成Hermite多项式

rs = h3.roots()
print(rs)
# [-1.50000000e+00, -3.61717794e-16,  5.00000000e-01]
pNew = p3.fromroots(rs)
print(pNew)
# 0.49999999999999983 + 0.37499999999999994 H_1(x) +
# 0.25000000000000006 H_2(x) + 0.125 H_3(x)

可以发现rootsfromroots并非对称的关系。

拟合

Hermite类中同样提供了拟合函数fit,定义为

Hermite.fit(x, y, deg, domain=None, rcond=None, full=False, w=None, window=None, symbol='x')

其中domain, window, symbol不必赘述,其中x,y为待拟合多项式;deg为多项式的阶数。rcond表示截止误差。fullFalse时,只返回拟合系数,否则还返回拟合的标准差等。

>>> p3.fit(xs, ys, 3)
>>> xs, ys = h3.linspace()
>>> h3_3 = h3.fit(xs, ys, 3)
>>> print(h3_3)
3.999999999999998 + 3.000000000000002 H_1(x) + 1.9999999999999984 H_2(x) +
1.0000000000000002 H_3(x)
>>> h3_4 = h3.fit(xs, ys, 4)
>>> print(h3_4)
3.9999999999999916 + 3.0000000000000036 H_1(x) +
1.9999999999999896 H_2(x) + 1.0000000000000002 H_3(x) -
9.797539357718845e-16 H_4(x)

可见其拟合效果还是不错的。

其他

degree返回多项式的最高项次数,cutdeg可以对多项式的次数做阶段,例如

>>> h3.degree()
3
>>> h3.cutdeg(2)
Hermite([4., 3., 2.], domain=[-1.,  1.], window=[-1.,  1.])
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值