我正在尝试编写一个脚本来获取等式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&lt; -rbind(sol,temp)},它会起作用。 我也会检查其他建议..谢谢。
答案 0 :(得分: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
答案 1 :(得分:1)
如果问题真的很简单,即求解2变量线性方程的根,你可以随时重新排列方程式,用a b = (1600-25*a)/20
来表示b,得到b
的所有值对于a
的对应值,并按b
e.g。
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