2016-12-23 3 views
2

Я использую R для расчета вложенных функций, как это:Как решить эту «не конечную функцию» в R?

C1_B <- function(T){integrate(function(tau)f(tau),lower=0.01*T,upper=0.99*T)$value} 

f <- function(tau) {integrate(function(tau1)sqrt(1/(tau-tau1)),lower=0.01*tau,upper=0.99*tau)$value} 

C1_B(0.5) 

Однако я получаю сообщение, как

«Ошибка в интеграции (функция (tau1) SQRT (1/(тау - tau1)), низший = 0,01 *: не-конечное значение функции

В дополнение: Предупреждение сообщение: **

В sqrt (1/(tau-tau1)): произведены NaN «

Я думаю, проблема связана с« (tau-tau1) »в моем коде; но из определяемого интегрального домена («lower = 0.01 * tau, upper = 0.99 * tau»), (tau-tau1) не может быть равным нулю.

Может ли любое тело рассказать мне, как я могу решить эту проблему?

+0

Является 'тау - tau1' всегда положителен в вашей программе? Если нет, это может быть одной проблемой, поскольку вы передаете ее функции 'sqrt'. – Abdou

+0

Какой смысл использовать параметр Z? – Vincent

+0

@ Параметр Vincent Z бесполезен, поэтому я удаляю его. – Lin

ответ

0

Я дал ему попробовать - проблема в том, что интеграция ожидает, что переданная функция сможет обрабатывать входные векторы и выводить вектор такого же размера.

К счастью, решение легко - просто заверните свою функцию в sapply.

Следующий код работает:

f <- function(tau) {integrate(function(tau1)sqrt(1/(tau-tau1)),lower=0.01*tau,upper=0.99*tau)$value} 

intfun <- function(x) sapply(x,f) 

C1_B <- function(T){integrate(function(tau) intfun(tau),lower=0.01*T,upper=0.99*T)$value} 
C1_B(0.5) 
+0

Это действительно решает проблему моего кода. @bdecaf Спасибо! – Lin

+0

рад помочь. Вы можете пометить решение, чтобы другие пользователи с одинаковой проблемой могли быстро найти решение. – bdecaf

0

Существует точное решение для вашего интеграла f. Однако полученное значение не согласуется с этим численным приближением. Я бы сказал, что интеграл

d(tau1)/sqrt(tau - tau1) 

является

-2 * sqrt(tau - tau1) 

С вами верхней границей 0.99*tau и вы нижней границей 0.01*tau вы получите

-2 * (sqrt(tau - 0.99 * tau) - sqrt(tau - 0.01 * tau)) = 
    -2 * sqrt(tau) * (sqrt(0.01) - sqrt(0.99)) 

Интеграции что тау может снова решаться точно. Это дает

-(4/3)(sqrt(0.01) - sqrt(0.99)) * tau^(3/2) 

Edit: С вашими данными границами 0.01*T и 0.99*T конечный полученный раствор

-(4/3)(sqrt(0.01)-sqrt(0.99)) * ((0.99 * T)^3/2 - (0.01 * T)^3/2) 

Вы можете использовать integrate на первый результат точного интегрирования (для F). Ошибок не возникает. Ошибки, о которых вы сообщаете, вероятно, связаны с методом аппроксимации. Возможно, вы могли бы попробовать другую интеграционную функцию, которая использует другое приближение. Точное решение функции f соответствует интегралу, рассчитанному в вашей программе.

Когда вы используете integrate для точного результата для f, результаты равны точному окончательному решению, которое я дал.

+0

Я исправил небольшую ошибку в упрощении первого уравнения, которое присутствовало в первой версии моего ответа, и я удалил окончательные уравнения. В следующем редактировании я добавил обновленные окончательные уравнения, и в последнем редактировании я добавил информацию, позволяющую проверить правильность точных результатов. –

+0

Ваше решение будет хорошим. Но моя формула сложнее, чем формула, которую я публикую здесь, поэтому мне не удалось получить такой точный результат интеграции. Я также пробую ваш совет относительно метода аппроксимации. Я использую другую интеграционную функцию «интеграл» в пакете «pracma». Но я также получаю сообщение остановки, что домен должен быть детерминированным числом; в то время как моя интегральная область изменяется с «tau». – Lin

+0

Слишком плохо. Не могли бы вы попытаться аппроксимировать интегралы, используя верхнюю и нижнюю суммы. Если вы сами напишите приближение, вы можете приспособиться к особенностям ваших границ, то есть к особенности, связанной с знаменателем, который может стать 0. –

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