文章目录
- 简介
- 图像
- 其他相关函数
简介
最开始看到这个名字,我也很激动,终于有个中文姓氏的数学公式了,然鹅司徒卢威是个俄国人,而且司徒卢威
完全是音译,就离谱。
司徒卢威函数是下面的非齐次贝赛尔方程的一组解:
x 2 d 2 y d x 2 + x d y d x + ( x 2 − v 2 ) y = 4 ( x 2 ) v + 1 π Γ ( v + 1 2 ) x^2\frac{\text d^2y}{\text dx^2}+x\frac{\text dy}{\text dx}+(x^2-v^2)y=\frac{4(\frac{x}{2})^{v+1}}{\sqrt\pi\Gamma(v+\frac{1}{2})} x2dx2d2y+xdxdy+(x2−v2)y=πΓ(v+21)4(2x)v+1
定义为
H v ( z ) = ( z / 2 ) v + 1 ∑ n = 0 ∞ ( − 1 ) n ( z / 2 ) 2 n Γ ( n + 3 2 ) Γ ( n + v + 3 2 ) H_v(z)=(z/2)^{v+1}\sum_{n=0}^\infty\frac{(-1)^n(z/2)^{2n}}{\Gamma(n+\frac{3}{2})\Gamma(n+v+\frac{3}{2})} Hv(z)=(z/2)v+1n=0∑∞Γ(n+23)Γ(n+v+23)(−1)n(z/2)2n
图像
当 v = 0 , 1 , 2 , 3 v=0,1,2,3 v=0,1,2,3时,其函数图像如图所示
绘图函数为
import numpy as np
from scipy.special import struve
import matplotlib.pyplot as plt
x = np.linspace(-10., 10., 1000)
for v in range(4):
plt.plot(x, struve(v, x), label=f'$H_{i!r}$')
plt.legend(ncol=2)
plt.show()
当 v v v取值为非整数时,要求 x x x取值必须大于0,可以绘制动图来查看其变化
# 这三个包在后面的程序中不再复述
import matplotlib.animation as animation
fig = plt.figure(figsize=(7,4))
ax = fig.add_subplot(autoscale_on=False,
xlim=(0,20),ylim=(0,200))
ax.grid()
plt.tight_layout()
theta_text = ax.text(0.05,0.95,'',
transform=ax.transAxes)
line, = ax.plot([], [], lw=1)
xs = np.linspace(0., 20., 1000)
def animate(v):
line.set_data(xs, struve(v, xs))
theta_text.set_text(f'v={v}')
return line, theta_text
vs = np.arange(50)/5
ani = animation.FuncAnimation(fig, animate, vs,
interval=15, blit=True)
ani.save("struve.gif")
plt.show()
效果为
其他相关函数
scipy
中提供了一些与司徒卢威函数联系紧密的函数,包括
func | 函数 | 表达式 |
---|---|---|
modstruve | 修正司徒卢威函数 | L v ( x ) = − i exp ( − i π v / 2 ) H v ( x ) L_v(x)=-i\exp(-i\pi v/2)H_v(x) Lv(x)=−iexp(−iπv/2)Hv(x) |
itstruve0 | H 0 H_0 H0的积分 | ∫ 0 x H 0 ( t ) d t \int_0^x H_0(t)\text dt ∫0xH0(t)dt |
it2struve0 | 与 H 0 H_0 H0有关的的积分 | ∫ x ∞ H 0 ( t ) t d t \int_x^\infty\frac{H_0(t)}{t}\text dt ∫x∞tH0(t)dt |
itmodstruve0 | 修正 H 0 H_0 H0的积分 | ∫ 0 x L 0 ( t ) d t \int_0^x L_0(t)\text dt ∫0xL0(t)dt |
其中modstruve
需要指定
v
v
v,在其取值不同时函数图像为
代码如下
import scipy.special as ss
x = np.linspace(-10., 10., 1000)
for v in range(4):
plt.plot(x, ss.modstruve(v, x), label=f'$L_{i!r}$')
plt.show()
三个积分函数的图像为
绘图代码如下
funcDct = {
'integral modified H0':ss.itmodstruve0,
'integral H0':ss.itstruve0,
'integral H0(t)/(t)':ss.it2struve0
}
fig = plt.figure()
xs = np.linspace(-10,10,1000)
for i,key in enumerate(funcDct):
ax = fig.add_subplot(1,3,1+i)
ys = funcDct[key](xs)
ax.plot(xs, ys)
ax.set_title(key)
plt.show()