scipy.special对于Bessel函数的零有很多功能,但是我找不到返回
的零的函数。x cot(x)+ b
其中b是给定的常数。这在Laplace转换解决方案中非常普遍。我错过了什么?有人知道可以计算这些零的Python实现吗?
答案 0 :(得分:1)
基于括号的寻根方法brentq
在这里效果很好。 x*tan(x)
和x*cot(x)
都有明确的单调性区域,每个区域都包含一个根(根据b
和左边界{{1}处的函数值的比较进行了一些调整) }。这些功能为搜索选择合适的时间间隔[左,右]。
需要避免奇异点,我懒惰地通过加或减0
来做到这一点;更好的解决方案是将此量基于1e-12
的值,或将b
放入try-catch块中,并在搜索失败时调整左右边界,因为该间隔没有被包围。
brent
测试:
import numpy as np
from scipy.optimize import brentq
def xtan_root(b, n): # returns the nth root of x*tan(x) - b, starting with n = 0
if b >= 0:
left = np.pi*n
right = left + np.pi/2 - 1e-12
else:
right = np.pi*(n + 1)
left = right - np.pi/2 + 1e-12
return brentq(lambda x: x*np.tan(x) - b, left, right)
def xcot_root(b, n): # returns the nth root of x*cot(x) - b, starting with n = 0
if b <= 1:
left = np.pi*n + 1e-12
right = np.pi*(n + 1) - 1e-12
else:
left = np.pi*(n + 1) + 1e-12
right = np.pi*(n + 2) - 1e-12
return brentq(lambda x: x/np.tan(x) - b, left, right)
输出:
print([xtan_root(4.2, k) for k in range(7)])
print([xtan_root(-4.2, k) for k in range(7)])
print([xcot_root(4.2, k) for k in range(7)])
print([xcot_root(-4.2, k) for k in range(7)])