R中一个递推解的迭代
有人用R语言问我一个问题,求递归关系的第30项R中一个递推解的迭代,r,matrix,iteration,linear-algebra,recurrence,R,Matrix,Iteration,Linear Algebra,Recurrence,有人用R语言问我一个问题,求递归关系的第30项x(n)=2*x(n-1)-x(n-2),其中x(1)=0和x(2)=1。我从数学推导中知道答案是29。但作为R的新手,我对如何在这里工作有点困惑。以下是我的代码: loop <- function(n){ a <- 0 b <- 1 for (i in 1:30){ a <- b b <- 2*b - a } return(a) } loop(30) loop您没有在循环中使用正
x(n)=2*x(n-1)-x(n-2)
,其中x(1)=0和x(2)=1
。我从数学推导中知道答案是29。但作为R的新手,我对如何在这里工作有点困惑。以下是我的代码:
loop <- function(n){
a <- 0
b <- 1
for (i in 1:30){
a <- b
b <- 2*b - a
}
return(a)
}
loop(30)
loop您没有在循环中使用正在迭代的变量,因此没有更新任何内容
loop <- function(n){
a <- 0
b <- 1
for (i in 1:30){
a <- b
b <- 2*i - a
}
return(a)
}
循环您可以定义一个递归函数
f <- function(x, n) {
n <- 1:n
r <- function(n) {
if (length(n) == 2) x[2]
else r({
x <<- c(x[2], 2*x[2] - x[1])
n[-1]
})
}
r(n)
}
x <- c(0, 1)
f(x, 30)
# [1] 29
f我想你需要的可能是下面这样的东西
loop <- function(n){
if (n<=2) return(n-1)
a <- 0
b <- 1
for (i in 3:n){
a_new <- b
b <- 2*b - a
a <- a_new
}
return(b)
}
如果您需要递归版本,下面是一个实现
loop <- function(n) {
if (n<=2) return(n-1)
2*loop(n-1)-loop(n-2)
}
你可以用另外两种方法来解决它
求解线性齐次递推关系,让
x(n)=r^n
插入递推关系,得到二次曲线
r^n-2*r^(n-1)+r^(n-2)=0
,即
r^2-2*r+1=0
,即
r=1,1
导致通解
x(n)=c1*1^n+c2*n*1^n=c1+n*c2
当x(1)=0和x(2)=1时,得到c2=1,c1=-1,s.t
x(n)=n-1
=>x(30)=29
因此,将x(n)计算为n的函数的R代码很简单,如下所示:
x <- function(n) {
return (n-1)
}
x(30)
#29
这是一个递归关系。未使用循环变量。
> loop(30)
[1] 29
x <- function(n) {
return (n-1)
}
x(30)
#29
library(expm)
A <- matrix(c(2,1,-1,0), nrow=2)
A %^% 29 %*% c(1,0) # [x(31) x(30)]T = A^29.[x(2) x(1)]T
# [,1]
# [1,] 30 # x(31)
# [2,] 29 # x(30)
# compute x(n)
x <- function(n) {
(A %^% (n-1) %*% c(1,0))[2]
}
x(30)
# 29