积分:积分可能是不同的

时间:2015-12-09 11:13:38

标签: r integrate

我正在使用integrate进行一些循环集成,我想出了一个我无法理解的错误。这是我可以提取的MWE:

u_min = 0.06911363
u_max = 1.011011 
m = 0.06990648
s = 0.001092265
integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail =  FALSE)}, u_min, u_max)

这会返回错误“整数可能会发散”,这显然是错误的。我尝试稍微修改一下这些参数,并以此为例:

u_min <- 0.07
u_max <- 1.1
m <- 0.0699
s <- 0.00109
integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail =  FALSE)}, u_min, u_max)

我尝试使用integrate查看debug函数,但它是C代码的包装器。我也不是正交技术的专家。我看到了这个SO post,却无法从中获得任何东西。

感谢

2 个答案:

答案 0 :(得分:3)

需要降低.Machine$double.eps^0.25(= 0.0001220703)的默认容差。例如,试试这个:

f <- function(v) pnorm(v, mean = m, sd = s, lower.tail =  FALSE)
integrate(f, u_min, u_max, rel.tol = 1e-15)

## 0.0009421867 with absolute error < 1.1e-17

答案 1 :(得分:1)

我会使用这种解决方法:

integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail =  FALSE)}, 
      max(u_min,m-10*s),min(u_max,m+10*s))$value  + (u_min-m+10*s)*(u_min<m+10*s)

我做了什么:

    {li> pnorm lower.tail=FALSEu_max > m+10*s的距离在距离均值非常远的位置时基本为零。因此,“拉伸”积分的正确限制毫无意义。因此,当m + 10*s时,您只需集成到10。您当然可以更改pnorm因子以增加精度;
  • 另一方面,左边u_min - m+10*s基本上总是1;所以你可以增强左边界限,缺少的部分只是<script type="text/javascript"> $(document).ready(function() { jQuery("#jQGridDemo").jqGrid({ url: 'Default.aspx/getData?2', datatype: "json", colNames: ['Dosage', 'Drug', 'Patient', 'Date'], colModel: [ { name: 'Dosage', index: 'Dosage', width: 20}, { name: 'Drug', index: 'Drug', width: 150, stype: 'text'}, { name: 'Patient', index: 'Patient', width: 150}, { name: 'Date', index: 'Date', width: 60} ], rowNum: 10, mtype: 'POST', loadonce: true, rowList: [10, 20, 30], pager: '#jQGridDemoPager', viewrecords: true, sortorder: 'desc', caption: "List Employee Details", loadComplete: function (result) { debugger; var i = 0; alert(result); }, loadError: function (xhr) { // debugger; alert("The Status code:" + xhr.status + " Message:" + xhr.statusText); //Getting reponse 200 ok } }); }); </script> 。与上述逻辑相同。