2016-06-30 5 views
1

Я новичок в 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) 

Когда я запускаю это, я получаю сообщение об ошибке сказав:

Ошибка в (т -х): аргумент "Т" отсутствует, не по умолчанию

Спасибо заранее,
-S

+1

Что такое 'Nd_theta()' и в вашей функции b один ')' отсутствует – Ravi

+1

вы это проверили? http://stackoverflow.com/questions/8913603/calculating-double-integrals-in-r-quickly – user5249203

+0

@Ravi Извините за неуклюжий пост. Я изменил уравнения и имена объектов для удобства понимания. Теперь я отредактировал этот вопрос. Надеюсь, теперь это ясно. – VitalSigns

ответ

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 дает вам лучший подход для выполнения двойного интеграла.

+0

Эй, спасибо, ответ. Он решил проблему, но я не понимаю, почему вы использовали t_i? – VitalSigns

+0

О, это просто заполнитель? – VitalSigns

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), чтобы работать, и вы не укажете их, когда просто кодируете 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){...}.

Смежные вопросы