我需要找到第一个超越方程的根
对于整数值和任何在哪里和是第一类和第二类贝塞尔函数的导数。这是环形圆柱体的特征函数展开中遇到的(标准?)问题。使用贝塞尔函数的递归性质,我们可以在没有导数的情况下重写这个方程,如下面的代码所示。
为了找到根,我fsolve
在 python 中使用标准的根查找算法,这需要初始猜测。我已经收集到第一个根的一个不错的猜测将是,我们要为其求根的贝塞尔函数的阶数。从图中我还了解到,根的间距有些均匀,因此在找到第二个根后,我可以找到其他猜测。
根的间距是非线性的. 我确信有一种强大的方法可以帮助进行根猜测,或者也许有更好的方法来做这件事。
from scipy.special import jn, yn
from scipy.optimize import fsolve
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import argrelextrema
# Recurrence relations to relate derivative of bessels to normal bessel
Jp = lambda m,x : 0.5*(jn(m-1,x)-jn(m+1,x))
Yp = lambda m,x : 0.5*(yn(m-1,x)-yn(m+1,x))
# r is the ratio of inner/ outer radii and is [0,1)
F = lambda k,m,r : Jp(m,k*r)*Yp(m,k)-Jp(m,k)*Yp(m,k*r)
plt.figure()
k_array = np.linspace(0.1,80,5000)
m = 5
r = 0.9
F_array = F(k_array,m,r)
guesses = np.asarray([m,m/(1-r)])
roots = fsolve(F,guesses,args=(m,r,))
#iroots = argrelextrema(F_array**2,np.less)[0]
#print iroots
plt.plot(k_array,F_array)
#plt.plot(k_array[iroots],np.zeros(len(iroots)),"ro")
plt.plot(roots,np.zeros(len(roots)),"ro")