r语言程序题

Python043

r语言程序题,第1张

R语言学习的人不多。第二题: td<-function(fx,a,b,r){ #(fx:是表达式,方程是fx=0,变量是x;a,b,区间[a,b],r是精度。 c<-(a+b)/2x<-cif(abs(eval(fx))

R里的伪随机数怎么取的不得而知,但逆变换法应该是在分布函数已知的情况下最方便的做法吧。

我们从最简单的指数分布来测试吧。方法1用逆变换,方法2用伪随机也就是R里的built-in.

最后比较每种方法和各自,还有和对方的最大绝对值差值的分布。

方法1:

invF <- function(x){ log(1/(1-x))}

D <- vector()

for (i in 1:100){

    a <- runif(1e4) # 两组1万个0-1均匀分布随机数

    b <- runif(1e4)

    ran1 <- sapply(a, invF)

    ran2 <- sapply(b, invF)

    D <- c(D, max(abs(ran1 - ran2)))

}

summary(D)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

7.651   9.100   9.762   9.875  10.540  13.940

方法2:

D <- vector()

for (i in 1:100){

    a <- rexp(1e4, rate = 1) # 两组1万个参数为1的指数分布随机数

    b <- rexp(1e4, rate = 1)

    D <- c(D, max(abs(a - b)))

}

summary(D)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

7.765   8.977   9.574   9.727  10.590  12.540

两种方法混合:a是逆变换,b是伪随机

invF <- function(x){ log(1/(1-x))}

D <- vector()

for (i in 1:100){

    a <- runif(1e4)          # 1万个0-1均匀分布随机数

    b <- rexp(1e4, rate = 1) # 1万个参数为1的指数分布随机数

    ran1 <- sapply(a, invF)

    D <- c(D, max(abs(ran1 - b)))

}

summary(D)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

7.679   8.701   9.385   9.536  10.150  13.610

有没有发现。。根本没什么不同。

Java调用R,就是使用JRI.jar中的Api,执行一条R语言命令,当然首先你要了解R语言的语法。

1.JRI中主要的API

Rengine R引擎,通过它进行R语言的启动、运算、画图、关闭等功能。

一个线程只能实例化一次,推荐使用单例模式。

实例化代码:

Rengine engine = new Rengine(null,false,null)

Rengine.versionCheck() //R版本校验,返回true:版本校验通过 返回false:版本校验未通过

engine.waitForR() //R加载校验,返回true:加载成功 返回false:加载失败

engine.end() //结束R,在后续没有调用R的情况下使用,否则R将退出,不能继续使用R。

2.REXP

R计算结果表达式

REXP rexp = engine.eval_r(String str) //执行R命令,返回结果REXP

rexp.asInt() rexp.asDouble() rexp.as.. //将REXP转成java类型

engine.assign(String name,double d) //定义R变量,name为R中变量的名字

以上大概了解了JRI的基本API,下面写个简单的例子。

//求n个数的最大值

Rengine engine = new Rengine(null,false,null)

int[] arr = new int[]{-1,2,1,-3,5,4,-2}

engine.assign("x",arr)

REXP rexp = engine.eval_r("max(x)")

int max = rexp.asInt()

System.out.println(max)

engine.end()