将函数与多个变量集成
integrating a function with multiple variables
我是 R 的新手,在使用集成方面需要一些帮助。
我有一个函数定义为:
a <- function(t) { exp(-r1*t) }
我有另一个使用此函数的函数,定义为:
b <- function(t,x) { a(t-x)* exp(-(1-exp(-r2*x))) }
其中,r1
和 r2
是常量。
现在,我需要为范围从 0
到 t
的 x
的值集成函数 b(t,x)
;鉴于 x <= t
.
我不确定如何进行。我尝试了以下方法,但我不确定如何告诉 R 在 'x' 而不是 't' 上进行积分。
c <- integrate(b, lower=0, upper=10)
当我 运行 这个时,我收到一条错误消息:
Error in a(t -x) : argument "t" is missing, with no default
提前致谢,
-S
首先,如果不是真的有必要,我总是不会在未解析的函数中使用参数。所以我会写 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
)才能工作而你不需要在编码 Nd_theta()
时指定它们。您可以通过仅在控制台中键入 Nd_theta()
来检查这一点。
关于您的实际问题:您可以通过以下方式指定附加参数:
r1 <- 1
r2 <- 1
Nd_theta <- b
integrate(Nd_theta, lower = 0, upper = 10, x = 5)
但是请注意 ?integrate
的帮助页面是怎么说的:Nd_theta
的 first 参数将用于集成。所以您可能需要将定义从 b <- function(t, x){...}
更改为 b <- function(x, t){...}
.
我以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
我的回答只是为了给你一个起点。链接的 post: calculating double integrals in R quickly 为您提供了进行二重积分的更好方法。
我是 R 的新手,在使用集成方面需要一些帮助。 我有一个函数定义为:
a <- function(t) { exp(-r1*t) }
我有另一个使用此函数的函数,定义为:
b <- function(t,x) { a(t-x)* exp(-(1-exp(-r2*x))) }
其中,r1
和 r2
是常量。
现在,我需要为范围从 0
到 t
的 x
的值集成函数 b(t,x)
;鉴于 x <= t
.
我不确定如何进行。我尝试了以下方法,但我不确定如何告诉 R 在 'x' 而不是 't' 上进行积分。
c <- integrate(b, lower=0, upper=10)
当我 运行 这个时,我收到一条错误消息:
Error in a(t -x) : argument "t" is missing, with no default
提前致谢,
-S
首先,如果不是真的有必要,我总是不会在未解析的函数中使用参数。所以我会写 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
)才能工作而你不需要在编码 Nd_theta()
时指定它们。您可以通过仅在控制台中键入 Nd_theta()
来检查这一点。
关于您的实际问题:您可以通过以下方式指定附加参数:
r1 <- 1
r2 <- 1
Nd_theta <- b
integrate(Nd_theta, lower = 0, upper = 10, x = 5)
但是请注意 ?integrate
的帮助页面是怎么说的:Nd_theta
的 first 参数将用于集成。所以您可能需要将定义从 b <- function(t, x){...}
更改为 b <- function(x, t){...}
.
我以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
我的回答只是为了给你一个起点。链接的 post: calculating double integrals in R quickly 为您提供了进行二重积分的更好方法。