【发布时间】:2020-04-23 00:20:33
【问题描述】:
我正在尝试计算 1 和以下 R 代码中给出的函数的某个截止“cut”之间的积分,即“int”。它取决于在我进行积分之前定义的 2 个参数 dM[i] 和 dLambda[j],对于每一对,我将结果保存在向量 'vec' 中:
vec = c() #vector for INT values: this is our goal
dM = seq(from = 0, to = 3, by = 0.01) #vector for mass density parameter
dLambda = seq(from = -1.5, to = 3, by = 0.01) #vector for vacuum energy density parameter
for (i in 1:length(dM)) {
for (j in 1:length(dLambda)) {
int = function(x) ((dM[i]*x^4*(x - 1) + dLambda[j]*x^2*(1 - x^2) + x^4)^(-1/2))
cut = 30
INT_data = integrate(int, 1, cut)
INT = INT_data$value
vec = c(vec, INT)
}
}
但是当我运行脚本时出现错误:“集成错误(int,1,cut):非有限函数值 "。但是,如果我尝试以下代码
int = function(x) ((0*x^4*(x - 1) -1.5*x^2*(1 - x^2) + x^4)^(-1/2))
cut = 30
INT_data = integrate(int, 1, cut)
INT = INT_data$value
vec = c(vec, INT)
我得到了正确的结果,没有任何错误。所以上面的错误是不正确的,它可以计算积分,但如果我使用 2 个“for”循环,R 似乎无法计算出来。如何重新编写代码,以便计算我想要的 dM[i] 和 dLambda[j] 的所有不同值?
【问题讨论】:
-
您应该在循环中打印出 i 和 j 以找出导致错误的原因。可能只有某些特定值失败,即函数中分母为零的值。
-
@user2554330 一旦我达到 dM[i] = 0 和 dLambda[j] = 1 我就会失败。我想这是因为 x = 0 点,但我已经删除了用 reg = 0.001 改变 x -> x + reg 的可能性,我仍然收到一个错误,说产生了 NaN。但我不明白,因为使用 reg 我已经消除了 NaN 的可能性
-
@user2554330 好吧,似乎这些值的积分确实是不同的。但是我怎样才能避免这个错误,所以我可以继续计算呢?我的意思是,程序不会停止
-
您可以使用
try()函数继续跟踪错误,即INT_data <- try(integrate(int, 1, cut)); if (inherits(INT_data, "try-error")) INT_data <- NA。