Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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_Equation Solving - Fatal编程技术网

R中一个方程的所有可能解

R中一个方程的所有可能解,r,equation-solving,R,Equation Solving,我想写一个R代码来生成方程x1+x2+…+xm=n的所有不同解,其中n是一个正整数,xi>=0是一个非负整数 我已经为此编写了一个R代码,但我不喜欢它的运行时间。此外,它不适用于相对较大的m和n值,如n=m=10。 我的代码如下 A<-matrix(ncol=m,nrow=choose((n+m-1),(m-1))) a<-1 for (h in 1:((n+1)^m)) { l <- rep(NA, m) for (il in 1:m

我想写一个R代码来生成方程x1+x2+…+xm=n的所有不同解,其中n是一个正整数,xi>=0是一个非负整数

我已经为此编写了一个R代码,但我不喜欢它的运行时间。此外,它不适用于相对较大的m和n值,如n=m=10。 我的代码如下

 A<-matrix(ncol=m,nrow=choose((n+m-1),(m-1)))
  a<-1
  for (h in 1:((n+1)^m)) {
        l <- rep(NA, m)
        for (il in 1:m) {
            l[il] <- (((h-1) %/% ((n+1)^(il-1))) %% (n+1)) + 1
            l[il]<-l[il]-1
        }
         if(sum(l)==n) { A[a,]<-l;a<-a+1}
    }
  A

A看起来你正在经历比需要更多的数字组合。当您输入代码时,n+m-1 choose m-1表示满足这类问题的解决方案的数量。考虑一下为什么这样做:我们想把n分成m个组。如果我们将n个元素并排排列,我们需要进行m-1切块来创建m个组。我们可以把每个印章看作是它自己的元素。让我们用n=8,m=5来具体考虑一下。好像我们需要将8个a分成5组(4个印章,用“/”表示)。这就像我们有一行12个空格,我们必须在这行中放8个a和4/。示例输出可以是:

a//a/a a/a

如果我们找到斜线索引之间的差异并减去一(并假设外部索引0和n+m上有两个额外的斜线),我们可以找到每个解决方案。对于上面的例子,5个数字是2(3-0-1)、0(4-3-1)、1(6-4-1)、4(11-6-1)和1(13-11-1)。因此,如果我们生成所有的(n+m-1)choose(m-1)结果,我们可以进行简单的减法运算,而不需要担心任何额外的组合

我们也可以使用
gtools
库中的
combinations()
函数对代码进行模拟

library(gtools)
nums <- rep(0, m)
combs <- combinations(n + m - 1, m - 1)
for(i in 1:choose(n + m - 1,m - 1)){
  for(j in 1:m){
    #edge case for beginning
    if(j == 1){
      nums[j] <- combs[i, j] - 1
    }
    #edge case for end
    else if(j == m){
      nums[j] <- n + m - combs[i, j-1] - 1
    }
    else {
      nums[j] <- combs[i, j] - combs[i, j-1] - 1
    }
  }
  A[i,] <- nums
}
库(gtools)
nums这可能会有所帮助:尽管您需要将其适应R。
rowSummer <- function(spaces, size, max){
  nums <- rep(0, size)
  for(j in 1:size){
    if(j == 1){
      nums[j] <- spaces[j] - 1
    }
    else if(j == size){
      nums[j] <- max - spaces[j-1] - 1
    }
    else {
      nums[j] <- spaces[j] - spaces[j-1] - 1
    }
  }
  nums
}

combs <- combinations(n+m-1, m-1)
A <- apply(combs, 1, rowSummer, size=m, max=n+m)
t(A)