试图以数​​字方式评估函数内的函数

时间:2014-05-11 03:15:41

标签: r integration numerical-integration

这是我的代码:

L=function(t){
  n0=n2=1
  n1=1.5151
  A=function(theta){
    n0/(sqrt(n1^2-n2^2*(sin(theta))^2))*n2^2*sin(theta)*cos(theta)/(n1^2-n0*sqrt(n1^2-n2^2*(sin(theta))^2))
  }
  B=function(theta){
    -50/(cos(theta))^2*n1*n2*sin(theta)/(n1^2-n0*sqrt(n1^2-n2^2*(sin(theta))^2))
  }
  F=function(theta0){
    exp(integrate(A(theta),lower=0,upper=theta0))
  }

  1/(F(t))*(50+integrate(F(theta)*B(theta),lower=0,upper=t))
}

我正在尝试评估积分中的积分。所以我在函数中放置了一些虚拟变量,显然你现在可以这样做了。任何人都可以帮我解决这个问题吗?谢谢。

2 个答案:

答案 0 :(得分:1)

integrate函数需要将函数作为其第一个参数,因此您只需传递Afunction(x) F(x)*B(x)之类的函数。错误消息" A(theta)中的错误:对象' theta'找不到"应该是关于这个问题的暗示。

其次,integrate函数返回类型integrate的列表,因此您似乎需要该列表的value元素。把它们放在一起:

L=function(t){
  n0=n2=1
  n1=1.5151
  A=function(theta){
    n0/(sqrt(n1^2-n2^2*(sin(theta))^2))*n2^2*sin(theta)*cos(theta)/(n1^2-n0*sqrt(n1^2-n2^2*(sin(theta))^2))
  }
  B=function(theta){
    -50/(cos(theta))^2*n1*n2*sin(theta)/(n1^2-n0*sqrt(n1^2-n2^2*(sin(theta))^2))
  }
  F=function(theta0){
    exp(integrate(A,lower=0,upper=theta0)$value)
  }

  1/(F(t))*(50+integrate(function(x) F(x)*B(x),lower=0,upper=t)$value)
}
L(1)
# [1] -19.33926

答案 1 :(得分:0)

这里有几个问题。首先exp(integrate(A(theta),lower=0,upper=theta0))不起作用,因为integrate会返回一个列表。您需要使用$value访问整数的值。

其次,要集成的第一个参数必须是函数,而不是函数值,因此integrate(A(theta),lower=0,upper=theta0)应该是integrate(A,lower=0,upper=theta0),并且与F*B的积分相同。我做了这些改变

L=function(t){
  n0=n2=1
  n1=1.5151
  B=function(theta){
    -50/(cos(theta))^2*n1*n2*sin(theta)/(n1^2-n0*sqrt(n1^2-n2^2*(sin(theta))^2))
  }
  F=function(theta0){
    A<-function(theta){
      n0/(sqrt(n1^2-n2^2*(sin(theta))^2))*n2^2*sin(theta)*cos(theta)/(n1^2-n0*sqrt(n1^2-n2^2*(sin(theta))^2))
    }
    exp(integrate(A,lower=0,upper=theta0)$value)
  }

  1/(F(t))*(50+integrate(function(x) F(x)*B(x),lower=0,upper=t)$value)
}

哪个运行,例如

> L(.5)
[1] 33.4549

我确定你想要合理性检查答案。