0

我正在尝试编写一个脚本来获取方程 25a+20b=1600 的一些特定值,其中 a 在 24:60 和 b 在 20:50 之间的范围内

我需要得到满足方程的 a 和 b 对。

我的第一个问题是如何用一位小数(a=24.0,24.1,24.2...等)定义 a 和 b 但我克服了这个定义a<-c(240:600)/10,所以我的第一个问题是:有没有直接的方法可以做到这一点?

现在,我做了几个嵌套循环,每次等式在向量中得到满足时,我都能得到,我想使用 rbind() 将此向量附加到矩阵或数据帧,但它无法正常工作,没有任何错误或警告。它只取第一个向量的值,就是这样!

这是我的代码,有人可以帮我定义问题出在哪里吗?

solve_ms <- function() {  
  index<-1  
  sol<-data.frame()  
  temp<-vector("numeric")  
  a<-c(240:600)/10  
  b<-c(200:500)/10  

 for (i in 1:length(a)){   
    for (j in 1:length(b)) {   
      c <- 25*a[i]+20*b[j]  
      if(c == 1600) {  
        temp<-c(a[i], b[j]) 
        if(index == 1) {  
          sol<-temp 
          index<-0  
        }  
        else   rbind(sol,temp)  
      }  
     }  
   }  

 return(sol)  
}

我发现我们的代码问题出在哪里,它使用 rbind 而不将其返回分配给数据框。我必须这样做 {sol<-rbind(sol,temp)} 并且它会起作用。我也会检查其他建议。谢谢。

4

2 回答 2

2

试试这个:

#define a function
fun <- function(a,b) (25*a+20*b) == 1600

由于浮点精度可能是一个问题:

#alternative function
fun <- function(a,b,tol=.Machine$double.eps ^ 0.5) abs(25*a+20*b-1600) < tol

#create all possible combinations
paras <- expand.grid(a=c(240:600)/10, b=20:50)
paras[fun(paras$a,paras$b),]

         a  b
241   48.0 20
594   47.2 21
947   46.4 22
1300  45.6 23
1653  44.8 24
2006  44.0 25
2359  43.2 26
2712  42.4 27
3065  41.6 28
3418  40.8 29
3771  40.0 30
4124  39.2 31
4477  38.4 32
4830  37.6 33
5183  36.8 34
5536  36.0 35
5889  35.2 36
6242  34.4 37
6595  33.6 38
6948  32.8 39
7301  32.0 40
7654  31.2 41
8007  30.4 42
8360  29.6 43
8713  28.8 44
9066  28.0 45
9419  27.2 46
9772  26.4 47
10125 25.6 48
10478 24.8 49
10831 24.0 50
于 2013-10-28T11:03:19.467 回答
1

如果问题真的这么简单,即求解 2 个变量线性方程的根,您总是可以重新排列方程以将 b 用 a 写成 ie b = (1600-25*a)/20,并获取b对应值的所有值,a并按 b 过滤组合

例如

a = c(240:600)/10
b = 20:50

RESULTS <- data.frame(a, b = (1600 - 25 * a)/20)[((1600 - 25 * a)/20) %in% b, ]
RESULTS
##        a  b
## 1   24.0 50
## 9   24.8 49
## 17  25.6 48
## 25  26.4 47
## 33  27.2 46
## 41  28.0 45
## 49  28.8 44
## 57  29.6 43
## 65  30.4 42
## 73  31.2 41
## 81  32.0 40
## 97  33.6 38
## 105 34.4 37
## 121 36.0 35
## 137 37.6 33
## 145 38.4 32
## 161 40.0 30
## 177 41.6 28
## 185 42.4 27
## 193 43.2 26
## 201 44.0 25
## 209 44.8 24
## 217 45.6 23
## 225 46.4 22
## 233 47.2 21
## 241 48.0 20
于 2013-10-28T11:32:20.850 回答