解决R中的BesselJ(J0)函数

奥罗努斯一世

我正在寻找一种解决R中BesselJ函数的方法。我知道有无限的可能性,但比方说,我想知道100甚至1000个第一个值……可能吗?

在此处输入图片说明

艾伦·卡梅伦

我是一个视觉思想家,所以这是我的处理方法。首先,设置一个介于1到100之间的x值序列。然后在每个点上获取n = 0的BesselJ值:

x <- seq(1, 100, 0.1)
y <- besselJ(x, 0)

现在将它们放在数据框中并绘制它们:

df <- data.frame(x, y)

library(ggplot2)

p <- ggplot(df, aes(x, y)) + geom_line()

p

现在我们可以看到,无论根在哪里,y值的符号都会发生变化,因此让我们确定y值更改符号的x值。我们可以将它们用作观察点。我们知道,因为我们的序列相距0.1,所以每个根必须落在这些点的-0.1和+0.1之间:

lower <- x[which(diff(sign(y)) != 0)] - 0.1

因此,我们可以使用这些范围作为输入uniroot,只要我们使用sapply到的范围,送入uniroot一个接一个。

bes <- function(x) besselJ(x, 0)
roots <- sapply(lower, function(z) uniroot(bes, interval = c(0, 0.2) + z)$root)

现在我们的根在1到100之间:

roots
#>  [1]  2.404822  5.520077  8.653728 11.791554 14.930917 18.071084 21.211636 24.352494
#>  [9] 27.493463 30.634588 33.775837 36.917098 40.058441 43.199791 46.341164 49.482615
#> [17] 52.624066 55.765511 58.906984 62.048469 65.189983 68.331441 71.472982 74.614519
#> [25] 77.756026 80.897543 84.039092 87.180630 90.322155 93.463719 96.605241 99.746820

我们可以通过将它们添加到绘图中来证明它们是正确的:

p + geom_point(data = data.frame(x = roots, y = besselJ(roots, 0)),
               colour = "red")

在速度方面,这将使您在不到十分之一秒的时间内获得前1000个根:

bes1000 <- function()
{
  x <- seq(1, 3143, 0.1)
  y <- besselJ(x, 0)
  lower <- x[which(diff(sign(y)) != 0)] - 0.1
  bes <- function(x) besselJ(x, 0)
  roots <- sapply(lower, function(z) uniroot(bes, interval = c(0, 0.2) + z)$root)
}

microbenchmark::microbenchmark(bes1000())
#> Unit: milliseconds
#>       expr     min       lq     mean   median       uq      max neval
#>  bes1000() 78.1617 81.22905 88.62894 83.09845 90.67025 396.5271   100

reprex软件包(v0.3.0)创建于2020-07-15

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 tensorflow 中实现 BesselJ 函数

来自分类Dev

解决R中的函数

来自分类Dev

此Apple无线卡上的J0,J1,J2,J3是什么?

来自分类Dev

如何在R中解决这样的符号函数

来自分类Dev

在Maxima中解决分段函数

来自分类Dev

在sympy中解决函数(python)

来自分类Dev

解决r中的LPP

来自分类Dev

如何解决R中ecdf函数中的运行时错误?

来自分类Dev

解决R中的一个整数:被积数是ODE解的一个函数

来自分类Dev

解决R中函数名称冲突的最佳方法是什么?

来自分类Dev

如何在R中的一个函数中找到多个解决方案?

来自分类Dev

通过在主函数中添加“返回0”无法解决“缺少类型说明符-假定为int”

来自分类Dev

解决R中的复数方程

来自分类Dev

解决R中的日期问题

来自分类Dev

解决构造函数中的虚拟成员调用

来自分类Dev

C ++函数中未解决的外部链接

来自分类Dev

如何解决php中的smarty函数?

来自分类Dev

C ++函数中未解决的外部链接

来自分类Dev

解决构造函数中的虚拟成员调用

来自分类Dev

从C中的函数返回{0}?

来自分类Dev

0 不是 Scheme 中的函数

来自分类Dev

在R中绘制函数

来自分类Dev

R中的精度函数

来自分类Dev

在R中创建函数

来自分类Dev

R中的质数函数

来自分类Dev

R中的diag()函数

来自分类Dev

R中的积分函数

来自分类Dev

在R中给函数命名

来自分类Dev

R中的优化函数