求解R中的积分:被积函数是常微分方程解的函数

求解R中的积分:被积函数是常微分方程解的函数,r,math,R,Math,我想计算一个积分,其中被积函数是常微分方程解的函数 为了求解积分,R需要为积分算法使用的每个值求解一个ODE。这就是我到目前为止所做的: require(deSolve) # Function to be passed to zvode in order to solve the ODE ODESR <- function(t, state, parameters) { with(as.list(c(state, parameters)),{ dPSI <-

我想计算一个积分,其中被积函数是常微分方程解的函数

为了求解积分,R需要为积分算法使用的每个值求解一个ODE。这就是我到目前为止所做的:

require(deSolve)

# Function to be passed to zvode in order to solve the ODE  
ODESR <- function(t, state, parameters) {
   with(as.list(c(state, parameters)),{
       dPSI <- -kappa*PSI+0.5*sigma^2*PSI^2
       dPHI <- kappa*theta*PSI
       return(list(c(dPSI, dPHI)))
   })
}

# For a given value of p this code should return the solution of the integral
pdfSRP <- function (p) {
   integrand <- function (u) {
       state <- c(PSI = u*1i, PHI = 0)
       out <- as.complex(zvode(y = state, times = times, parms = parameters, fun = ODESR)[2, 2:3])
       Re(exp(out[2] + out[1]*x)*exp(-u*1i*p))
   }
integrate(f = integrand, lower = -Inf, upper = Inf)$value/(2*pi)
}
产生以下错误:

Error in eval(expr, envir, enclos) : object 'PSI' not found
我就是不明白为什么。我很确定这是由于语法错误,因为运行:

integrand <- function (u) {
       state <- c(PSI = u*1i, PHI = 0)
       out <- as.complex(zvode(y = state, times = times, parms = parameters, fun = ODESR)[2, 2:3])
       Re(exp(out[2] + out[1]*x)*exp(-u*1i*p))
}

被积函数在
被积函数
输入
u
中似乎存在向量化问题。如果我理解正确,
PSI
应该是每次计算的一个数字,而不是一个数字向量(这将在
PSI
PHI
之间产生量纲问题)

integrand <- Vectorize(integrand)
如果我们画出被积函数,我们可以发现散度问题

p <- 2
par(mfrow = c(1,2))
curve(integrand,-1e3,1e3,n = 100)
curve(integrand,-1e3,1e3,n = 1e3)

p您好!只有一个简短的注释:您的变量
u
有问题。请尝试
print(state)
在定义完状态变量后,
state
您将看到
u
的长度为15,而不是1。如果答案的第二部分没有帮助,请告诉我,我将删除它,因为它不是对您问题的直接回答。:)谢谢!答案的第二部分很有帮助。请不要删除它:)。为了确保我所做的一切都是正确的:在打印最终解决方案之前,R打印了很多值是否正确?
pdfSRP
应该只返回一个值,
int$value/(2*pi)
(“每个
的积分的最终估计值?integral
)。如果你得到了中间结果,也许你有一个
print
cat
的地方?通过对你问题的评论,也许可以寻找一个被遗忘的测试语句
print(state)
,这是Jm:)建议的。是的,你是对的。我忘了删除那个
print()
。。。非常感谢你的帮助!
integrand <- Vectorize(integrand)
pdfSRP(p = 2)
## Error in integrate(f = integrand, lower = -Inf, upper = Inf) : 
## the integral is probably divergent 
p <- 2
par(mfrow = c(1,2))
curve(integrand,-1e3,1e3,n = 100)
curve(integrand,-1e3,1e3,n = 1e3)
pdfSRP <- function (p) {
    int <- integrate(f = integrand, lower = -Inf, upper = Inf,
                    subdivisions = 1e3)
    int$value/(2*pi)
}
## [1] 2.482281e-06