我是R的新手,需要一些使用集成的帮助。 我有一个函数定义为:
a <- function(t) { exp(-r1*t) }
我有另一个使用此功能的功能,定义为:
b <- function(t,x) { a(t-x)* exp(-(1-exp(-r2*x))) }
其中,r1
和r2
是常量。
现在,我需要将函数b(t,x)
集成到x
的值,范围从0
到t
;鉴于x <= t
。
我不知道如何处理这个问题。我尝试了以下内容,但我不确定如何告诉R整合'x'而不是't'。
c <- integrate(b, lower=0, upper=10)
当我运行此操作时,我收到错误消息:
(t -x)中的错误:缺少参数“t”,没有默认值
提前致谢,
-S
答案 0 :(得分:3)
我使用r1 = r2 = 1
作为示例。
因为您需要双积分:
\int_{t=0}^{t=10} \int_{x=0}^{x=t} b(x,t)
最基本的方法是两次应用integrate()
。
首先,您需要定义一个矢量化函数来评估内部积分:
z <- function(t) sapply(t, function (t_i) integrate(b, lower = 0, upper = t_i, t = t_i)$value)
我们可以查看:
z(1:3)
# [1] 0.4225104 0.4440731 0.4150334
现在,我们将外部积分应用于z
:
integrate(z, lower = 0, upper = 10)
# 3.795567 with absolute error < 6.2e-06
我的回答只是为了给你起点。链接的帖子:calculating double integrals in R quickly为您提供了更好的双重积分方法。
答案 1 :(得分:0)
首先,我总是不会在函数中使用参数,如果不是真的必要的话,它们不会被解析。所以我会写a <- function(t, r1) { exp(-r1*t) }
和b <- function(t, x, r2) { a(t-x)* exp(-(1-exp(-r2*x))) }
(还有一个结束括号丢失)。
第二件事,我不会命名结果(和其他对象)c
,因为这已经是R中的函数名。
第三件事,你的问题没有说明Nd_theta
是什么,所以我认为它是b
。
第四件事,您将函数Nd_theta
解析为integrate
而不是结果Nd_theta(...)
。相关的下一件事:错误消息不会因integrate
而发生,但因为Nd_theta
需要两个参数(可能是x
和t
)才能工作而且您不需要#39; t仅在编码Nd_theta()
时指定它们。您只需在控制台中输入Nd_theta()
即可查看此内容。
关于您的实际问题:您可以通过以下方式指定其他参数:
r1 <- 1
r2 <- 1
Nd_theta <- b
integrate(Nd_theta, lower = 0, upper = 10, x = 5)
但请注意?integrate
的帮助页面说明的内容:Nd_theta
的第一个参数将用于整合。因此,您可能需要将定义从b <- function(t, x){...}
更改为b <- function(x, t){...}
。