x tan(x)-b

时间:2018-11-05 18:55:43

标签: python scipy

scipy.special对于Bessel函数的零有很多功能,但是我找不到返回

的零的函数。

x cot(x)+ b

其中b是给定的常数。这在Laplace转换解决方案中非常普遍。我错过了什么?有人知道可以计算这些零的Python实现吗?

1 个答案:

答案 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)])