在R中的三角形区域上的双重积分

时间:2013-02-16 11:15:29

标签: r geometry integrate

我对编程非常陌生并且本质上是通过反复试验来学习,但是我遇到了一个我不知道如何处理的问题。我需要在R中的三角形区域进行双重积分。由于通常的积分函数似乎无法处理这个问题,我尝试使用cubature package(*编辑 - 请参阅下面的完整代码)。

更新/编辑: 我一直在努力解决这个问题,但我仍然遇到同样的问题。我知道我必须确保值在asin计算的适当范围内。然而,这仍然没有解决三角区域的基本问题。如果我在下面发布我的完整代码,也许会更清楚:

L <- 25
n <- -4
area <- 30
distances <- L*seq(0.005, 100, 0.05)

cond <- area*pi
d <- 5

fun <- function(x=1,r=0)
{
  if (x<cond) {
    return(0)
  } else {
    return((-1)*((n+2)/(2*pi*(L^2)))*(1+((x/L)^2))^(n/2)*(1/pi)*(1/pi)*acos(d/x))*asin(sqrt((pi*area)/d+r))
  }
}
fun(5)
fun(300)

library(cubature)
integrationone <- function()
{
  integrand <- adaptIntegrate(fun, lowerLimit=c(d,0), upperLimit=c(80,80))
  return(integrand$integral)
}
integrationone()
warnings()

通过查看警告消息,R似乎无法在集成x时对条件参数进行评估,因此我仍然无法获取我想要的确切区域的值整合。有没有人有任何想法或建议?

1 个答案:

答案 0 :(得分:2)

我不认为adaptIntegrate背后的代码可以帮助您实现目标。您可以输入控制台adaptIntegrate,然后您将获得代码。它本质上是对C算法的调用。

  1. 为了了解它的发生,我认为您之前需要了解您的整合情况。尝试简化您的功能,查看他的定义域。

     INV_PI <- 1/pi
     fun <- function(X){  
        scale <- -1*((n+2)/(2*pi*(L^2)))*INV_PI^2 *acos(d/(d+r))
        res <- scale*asin(sqrt((pi*area)/X))* (1+((X/L)^2))^(n/2)
        sqrt(prod(res))
     }
    

    这里有关于X的2个术语,但只有一个可以产生问题。

    asin(sqrt((pi*area)/X)) 
    
  2. asin仅在[-1,1]之间定义,sqrt仅定义为正数。

    所以这里的乐趣是在[pi*area,INF]之间定义的,你必须在这个域中集成。

    例如:

    low.Lim <- pi*area
    doubleintegration <- function()  
    {  
      integrand <- adaptIntegrate(fun, lowerLimit=c(low.Lim,low.Lim), 
                                       upperLimit=c(200*low.Lim,200*low.Lim))  
      return(integrand$integral)  
    }  
    
    doubleintegration()
    [1] 0.1331089