Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中一个递推解的迭代_R_Matrix_Iteration_Linear Algebra_Recurrence - Fatal编程技术网

R中一个递推解的迭代

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您没有在循环中使用正

有人用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您没有在循环中使用正在迭代的变量,因此没有更新任何内容


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