我正在尝试编写一个脚本来获取方程 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)},它会起作用。我也会检查其他建议..谢谢。
试试这个:
#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
如果问题真的这么简单,即求解 2 个变量线性方程的根,您可以随时重新排列方程以将 b 写成 a,即 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