写一个循环来选择在R中产生正方程值的所有变量值组合

Bio*_*eek 10 random combinations for-loop r permutation

我有以下四个方程(a,b,c,d),有几个不同的变量(x,t,v,w,n,f).我的目标是尝试找到所有可以生成方程(a,b,c,d)的所有正(和非)数的变量值集.常规循环只会遍历生成的每个序列,并系统地检查它是否生成正值.我希望它从每个序列中获取随机数并将其与R中的其他序列进行测试.例如(x = 8,t = 2.1,v = 13,w = 1,n = 10,f = 1)是可能的一组组合.

请不要建议解析性地解决这些问题,然后找出价值观.这些只是我正在处理的方程式的表示.我所拥有的方程非常复杂,超过15个变量.

#Equations
a <- x * t - 2*x
b <- v - x^2 
c <- x - w*t - t*t 
d <- (n - f)/t

x <- seq(from = 0.0001, to = 1000, by = 0.1)
t <- seq(from = 0.0001, to = 1000, by = 0.1)
v <- seq(from = 0.0001, to = 1000, by = 0.1)
w <- seq(from = 0.0001, to = 1000, by = 0.1)
n <- seq(from = 0.0001, to = 1000, by = 0.1)
f <- seq(from = 0.0001, to = 1000, by = 0.1)
Run Code Online (Sandbox Code Playgroud)

jdo*_*res 3

首先,最好将方程和探测值组织到列表中:

set.seed(1222)

values <- list(x = x, t = t, v = v, w = w, n = n, f = f)

eqs <- list(
  a = expression(x * t - 2 * x),
  b = expression(v - x^2), 
  c = expression(x - w*t - t*t), 
  d = expression((n - f)/t)
)
Run Code Online (Sandbox Code Playgroud)

然后我们可以定义从每个探针向量中随机抽取的多个样本:

samples <- 3
values.sampled <- lapply(values, sample, samples)

$x
[1] 642.3001 563.1001 221.3001

$t
[1] 583.9001 279.0001 749.1001

$v
[1] 446.6001 106.7001   0.7001

$w
[1] 636.0001 208.8001 525.5001

$n
[1] 559.8001  28.4001 239.0001

$f
[1] 640.4001 612.5001 790.1001
Run Code Online (Sandbox Code Playgroud)

然后我们可以迭代每个存储的方程,在“采样”环境中评估方程:

results <- sapply(eqs, eval, envir = values.sampled)

            a          b         c          d
[1,] 373754.5 -412102.82 -711657.5 -0.1380373
[2,] 155978.8 -316975.02 -135533.2 -2.0935476
[3,] 165333.3  -48973.03 -954581.8 -0.7356827
Run Code Online (Sandbox Code Playgroud)

从那里您可以删除任何 0 或更小的值:

results[results <= 0] <- NA
Run Code Online (Sandbox Code Playgroud)