当c
不是0,−1,⋯0,-1,\cdots0,−1,⋯时,对于∣z∣<1|z|<1∣z∣<1,超几何函数可表示为
2F1(a;b;c;z)=∑n=0∞a(n)b(n)c(n)znn!_2F_1(a;b;c;z)=\sum^\infty_{n=0}\frac{a^{(n)}b^{(n)}}{c^{(n)}}\frac{z^n}{n!} 2F1(a;b;c;z)=n=0∑∞c(n)a(n)b(n)n!zn
其中q(n)q^{(n)}q(n)定义为
q(n)={1n=0q(q+1)⋯(q+n−1)n>1q^{(n)}=\left\{\begin{aligned} &1\quad&n=0\\ &q(q+1)\cdots(q+n-1)&\quad n>1 \end{aligned}\right. q(n)={1q(q+1)⋯(q+n−1)n=0n>1
所以在scipy
中,超几何函数定义为
scipy.special.hyp2f1(a, b, c, z)
2F1_2F_12F1在a,b,c
取某些特殊值的时候,可以化身为常见的初等函数,例如
import numpy as np
import matplotlib.pyplot as plt
import scipy.special as sc
xs = np.arange(1,1001)/100
ys = sc.hyp2f1(1,1,2, -xs)fig = plt.figure()
ax = fig.add_subplot(121)
ax.plot(xs,ys)
ax = fig.add_subplot(122)
ax.plot(xs,np.log(1+xs)/xs)
plt.show()
效果如下图,可以说一毛一样
超几何函数常见的特殊情况有
2F1(1,1,2,−z)=ln(1+z)z2F1(a,1,1,z)=(1−z)−a2F1(0.5,0.5,1.5,z2)=arcsinzz\begin{aligned} _2F_1(1,1,2,-z) &= \frac{\ln(1+z)}{z}\\ _2F_1(a,1,1,z) &= (1-z)^{-a}\\ _2F_1(0.5,0.5,1.5,z^2) &= \frac{\arcsin z}{z} \end{aligned} 2F1(1,1,2,−z)2F1(a,1,1,z)2F1(0.5,0.5,1.5,z2)=zln(1+z)=(1−z)−a=zarcsinz
之所以超几何函数表示为2F1_2F_12F1,乃因存在一个更广泛的函数,广义超几何函数,可表示为
pFq(a1,a2,⋯,ap;b1,b2,⋯,bq;z)=∑n=0∞∏i=1p(ai)n∏i=1q(bi)(n)znn!_pF_q(a_1,a_2,\cdots,a_p;b_1,b_2,\cdots,b_q;z)=\sum^\infty_{n=0}\frac{\prod^p_{i=1}(a_i)^{n}}{\prod^q_{i=1}(b_i)^{(n)}}\frac{z^n}{n!} pFq(a1,a2,⋯,ap;b1,b2,⋯,bq;z)=n=0∑∞∏i=1q(bi)(n)∏i=1p(ai)nn!zn
当p=0, q=0
时,上式退化为泰勒级数eze^zez。
scipy
中提供了p=1,q=1p=1,q=1p=1,q=1以及p=0,q=1p=0,q=1p=0,q=1的形式,如下所示,其中b同样不能为非正整数
。
scipy.special.hyp1f1(a, b, x)
scipy.special.hyp0f1(v, z)
其中0F1_0F_10F1是微分方程f′′(z)+vf′(z)=f(z)f''(z)+vf'(z)=f(z)f′′(z)+vf′(z)=f(z)的解。
最后,scipy
实现了库默尔函数hyperu(a, b, x)
,为Kummer方程的解,Kummer方程的形式如下
zd2wdz2+(b−z)dwdz−aw=0z\frac{\text d^2w}{\text dz^2}+(b-z)\frac{\text dw}{\text dz}-aw=0 zdz2d2w+(b−z)dzdw−aw=0