Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_For Loop_Differential Equations_Data.table - Fatal编程技术网

在R中对联立方程组的参数值进行重采样时,如何存储循环的输出?

在R中对联立方程组的参数值进行重采样时,如何存储循环的输出?,r,loops,for-loop,differential-equations,data.table,R,Loops,For Loop,Differential Equations,Data.table,我有一个计算4个联立方程参数值的代码。我特别感兴趣的是当a+b(存储在results$ab中)大于3000时存储所有参数组合。如果大于3000,则编码为“是”。我想写一个for循环,它将循环代码以检查a+b>3000并存储相应的值。然后,我希望程序循环1000次,并存储相应“Yes”的参数值。我正在尝试存储输出,但它不会产生任何结果 x <- seq(from = 0.0001, to = 1000, by = 0.1) t <- seq(from = 0.0001, to = 10

我有一个计算4个联立方程参数值的代码。我特别感兴趣的是当a+b(存储在results$ab中)大于3000时存储所有参数组合。如果大于3000,则编码为“是”。我想写一个for循环,它将循环代码以检查a+b>3000并存储相应的值。然后,我希望程序循环1000次,并存储相应“Yes”的参数值。我正在尝试存储输出,但它不会产生任何结果

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)


  values <- list(x = x, t = t, v = v, w = w, n = n, f = f)
  for(i in 1:1000){
    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)
    )

    for(i in 1:1000){
    samples <- 10000
    values.sampled <- lapply(values, sample, samples)
    results[i] <- sapply(eqs, eval, envir = values.sampled)
    results[i] <- data.frame(results)
    results$ab[i] <- results$a[i] + results$b[i]
    results$binary[i] <- ifelse(results$ab[i] > 3000, "Yes","No")
    output[i] <- results[results$binary=="Yes",]

  }

what <- as.list(output)
x这里有一个依靠蛮力的解决方案-对
x
t
的所有组合以及
x
v
的组合进行评估:

library(data.table)
# create data
dt <- as.data.table(replicate(6, seq(from = 0.001, to = 1000, by = 1), simplify = F))
names(dt) <- c('x', 't','v','w','n','f')

# if your data.frame has all the combinations you want:
dt[, lapply(eqs, eval, envir = .SD)][, a_b := a + b][]

# This does all of the combinations for eqs a and b - takes 22 seconds for 10,000 rows
dt[, {x_t = CJ(x,t)
      x_v = CJ(x,v)
      a_b = eval(eqs$a, envir = x_t) + eval(eqs$b, envir = x_v)
      output = a_b > 3000L
      list(x = x_t[[1]], t = x_t[[2]], v = x_v[[2]], ab = a_b, output = output)
      }
   ][output == T,]

              x       t       v       ab output
     1:   3.001 754.001 754.001 3001.750   TRUE
     2:   3.001 755.001 755.001 3005.751   TRUE
     3:   3.001 756.001 756.001 3009.752   TRUE
     4:   3.001 757.001 757.001 3013.753   TRUE
     5:   3.001 758.001 758.001 3017.754   TRUE
    ---                                        
479045: 992.001 998.001 998.001 4966.005   TRUE
479046: 992.001 999.001 999.001 5959.006   TRUE
479047: 993.001 998.001 998.001 3977.004   TRUE
479048: 993.001 999.001 999.001 4971.005   TRUE
479049: 994.001 999.001 999.001 3981.004   TRUE
库(data.table)
#创建数据

dt
a+b
等于
(x*t-2*x)+(v-x^2)
,它只是
x
中的一个二次方,所以你可以解析地解
a+b>3000
v
t

不等式是
x^2+(2-t)x+(3000-v)<0

替换
T=2-T
V=3000-V
,然后
x^2+Tx+V<0

对于任何小于零的值,它必须有两个实根,这意味着
T^2-4V>0
-即
V<(T^2)/4
。()

给定满足该不等式的
T
V
,其中
a+b>3000
x的值是二次方的根之间的值,即
|2x+T |

因此,如果您希望选择满足条件的值,则可以直接在
t
的值范围内循环,选择满足
v<(t^2)/4
v
,然后选择适当范围内的
x

这里有一个方法

t <- 1:1000
T <- 2 - t
V <- sapply((T ^ 2) / 4, function(z) runif(min = 0, max = z, n = 1)) #assumes V>0 (???)
v <- 3000 - V
x <- (sapply(sqrt(T ^ 2 - 4 * V), function(z) runif(min = -z, max = z, n = 1)) - T) / 2
ab <- (x * t - 2 * x) + (v - x ^ 2) #all >3000 (except for t=2, where ab=3000 exactly)

t根据您的描述,这里有一个tidyverse解决方案:

库(tidyverse)
n每项试验的样本数%head(2)%>%scape()
#>2人名单
#>$:类“tbl_df”、“tbl”和“data.frame”:4840 obs。在12个变量中:
#>..$x:num[1:4840]720.722.944.720.710.6。。。
#>..$t:num[1:4840]794325768400531。。。
#>..$v:num[1:4840]172 962 853 901 264。。。
#>..$w:num[1:4840]842.8274.318.9957.2321.8。。。
#>..$n:num[1:4840]605322671890965。。。
#>..$f:num[1:4840]397557299691825。。。
#>..$a:num[1:4840]57079573973422282455604。。。
#>..$b:num[1:4840]-519236437-1145473152。。。
#>..$c:num[1:4840]-1298899-194750-603673-543387-452411。。。
#>..$d:num[1:4840]0.261-0.7230.486 0.497 0.264。。。
#>..$ab:num[1:4840]51558 7834 33077 8718 5756。。。
#>..$binary:chr[1:4840]“是”“是”“是”“是”。。。
#>$:类“tbl_df”、“tbl”和“data.frame”:4815 obs。在12个变量中:
#>..$x:num[1:4815]400806410 477169。。。
#>..$t:num[1:4815]992938893573257。。。
#>..$v:num[1:4815]453773456279933。。。
#>..$w:num[1:4815]778254 189183784。。。
#>..$n:num[1:4815]629811151529667。。。
#>..$f:num[1:4815]90330995908340。。。
#>..$a:num[1:4815]395543 754765 365563 271843 43214。。。
#>..$b:num[1:4815]-159307-649186-167726-226773-27764。。。
#>..$c:num[1:4815]-1754435-1117341-966696-431818-267523。。。
#>..$d:num[1:4815]-0.2770.513-0.654-0.6621.275。。。
#>..$ab:num[1:4815]2362361055791978374507015450。。。
#>..$binary:chr[1:4815]“是”“是”“是”“是”。。。
由(v0.3.0)于2019年10月19日创建


如果我误解了目标,请告诉我。

列表名称中不能使用数组索引符号,因此[I]=表达式(…)不正确。同样对于每个迭代i,x,t,v。。。向量是一样的,为什么要重复1000次呢?你是在尝试采样x,t,v,…,的各种值,计算a,b,c,d,然后计算出这些x,t,…,的哪些组合,。。最终a+b>3000?你能做一个约束优化吗?找到x,t。。。a+b>3000?你说得对。看起来我必须循环采样x,t,v的各种值来计算a,b,c,d,这使得a+b>3000。我不知道如何进行约束优化方法为什么循环有两个
?一个真的嵌套在另一个里面吗?无论哪种方式,其中一个都缺少结束括号。
results
是何时第一次定义的?我在
results[I]上遇到一个错误,你能解释一下CJ[x\t]是什么吗?另外,当我运行这个输出时,我得到了5列的空data.table(0行):x,t,v,ab,output@Biotechgeek
CJ()
expand.grid()
非常相似,因为它是两个向量的笛卡尔积。您的评论是
CJ[x_t]
,这只是一个向量。我的代码是
x\u t=CJ(x,t)