fl=function(q,a=-23.0344,b=10.0249) (b/q)*dnorm((a+b*log(q)),0,1)
Fl=function(h) integrate(fl,lower=0,upper=h)$value
Fz=function(z){
integrand=function(x){
Fl((x-z)*10)*fl(10*x)
}
1-10*integrate(integrand,0,Inf)$value
}
library(GoFKernel)
inv=inverse(Fz,lower=-100000,upper=100000)
为什么会出现此错误?“积分错误(fl,下限= 0,上限= h):'upper'的长度必须为1”
我该怎么解决呢?
1条答案
按热度按时间iszxjhcz1#
正如注解中所建议的那样,当您运行
integrate()
时,它会尝试计算被积函数的值向量。我尝试对
Fl
函数进行矢量化(有多种方法可以做到这一点:Vectorize
、Map
、purrr::map
、vapply()
......但我使用了一个很好的老式for
循环)一旦这是固定的,我们打。
积分误差(fl,下限= 0,上限= h[i]):非有限函数值
我们还得到一个警告,即
log(q)
是为q
的负值调用的,这将产生一个NaN
,它将使下游的一切都变得混乱。我们可以设置
options(error = browser)
,但是我在这方面遇到了麻烦,相反,我设置了一个检查点,如果q
使用负值(这将不可避免地导致麻烦):当我被扔到浏览器中时,我尝试:
所以你必须考虑你在做什么(TBH我还没有试图弄清楚你代码的逻辑),以及你是否无意中在不允许的情况下在负范围上计算表达式。