如何在 tensorflow 中实现 BesselJ 函数
How do I implement BesselJ functions in tensorflow
tensorflow内部函数支持贝塞尔函数BesselI tensorflow besseli0.
但是,它没有 BesselJ 函数(尤其是 BesselJ[2,x])。
如果我要逼近这个函数,我将不得不在tensorflow中使用If
,这效率不高。
tensorflow有没有替代方法或者其他方法可以推荐?
经过多方查找,我找到了一个刚刚好解决方案:
def BesselJ0(x):
PI=3.1415926
temp = tf.cast(tf.less(x,tf.ones_like(x)*4.7),dtype=tf.float32)
temp1 = tf.abs(temp-1)
left_part = tf.multiply(1-x**2/4+x**4/64-x**6/2304+x**8/147456-x**10/14745600,temp)
right_part = tf.multiply(tf.sqrt(2/PI/x)*tf.cos(x-PI/4),temp1)
return left_part+right_part
def BesselJ1(x):
PI=3.1415926
temp = tf.cast(tf.less(x,tf.ones_like(x)*3.8),dtype=tf.float32)
temp1 = tf.abs(temp-1)
left_part = tf.multiply(x/2-x**3/16+x**5/384-x**7/18432+x**9/1474560-x**11/176947200+x**13/29727129600,temp)
right_part = tf.multiply(tf.sqrt(2/PI/x)*tf.cos(x-PI/2-PI/4),temp1)
return left_part+right_part
不过这不是很快。
tensorflow内部函数支持贝塞尔函数BesselI tensorflow besseli0.
但是,它没有 BesselJ 函数(尤其是 BesselJ[2,x])。
如果我要逼近这个函数,我将不得不在tensorflow中使用If
,这效率不高。
tensorflow有没有替代方法或者其他方法可以推荐?
经过多方查找,我找到了一个刚刚好解决方案:
def BesselJ0(x):
PI=3.1415926
temp = tf.cast(tf.less(x,tf.ones_like(x)*4.7),dtype=tf.float32)
temp1 = tf.abs(temp-1)
left_part = tf.multiply(1-x**2/4+x**4/64-x**6/2304+x**8/147456-x**10/14745600,temp)
right_part = tf.multiply(tf.sqrt(2/PI/x)*tf.cos(x-PI/4),temp1)
return left_part+right_part
def BesselJ1(x):
PI=3.1415926
temp = tf.cast(tf.less(x,tf.ones_like(x)*3.8),dtype=tf.float32)
temp1 = tf.abs(temp-1)
left_part = tf.multiply(x/2-x**3/16+x**5/384-x**7/18432+x**9/1474560-x**11/176947200+x**13/29727129600,temp)
right_part = tf.multiply(tf.sqrt(2/PI/x)*tf.cos(x-PI/2-PI/4),temp1)
return left_part+right_part
不过这不是很快。