求解R中的积分:被积函数是常微分方程解的函数
我想计算一个积分,其中被积函数是常微分方程解的函数 为了求解积分,R需要为积分算法使用的每个值求解一个ODE。这就是我到目前为止所做的:求解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 <-
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