2016-08-01 1 views
0

je voudrais calculer les éléments suivants intégrale en R:valeur de la fonction non-finie avec intégration() R, bien que la solution existe

print(integrate(function(x){((1.-x)^2)/(abs(1.-x))^(1/3)},lower = 0, upper = 1.6, abs.tol = 1E-7)$value) 

Et je reçois cette erreur:

Error in integrate(function(x) { : non-finite function value

Toutefois, lorsque J'intègre jusqu'à 1.600001 ou 1.599999, cela fonctionne et donne 0.4710365 et 0.4710357.

Mais il n'y a rien de spécial avec cette fonction au point 1.6 ... Il devrait y avoir un problème numérique étrange dans R.

Toutes les idées?

Répondre

0

Conformément @ la réponse de BHA, je pencherais pour la solution suivante:

> f <- function(x){ifelse(x!=1,((1.-x)^2)/(abs(1.-x))^(1/3),0)} # Set f(1)=0 since it is the limit of 'f' at 1. 
> integrate(f,lower=0,upper=1.6,abs.tol=1E-7) 
0.4710361 with absolute error < 2.2e-08 

« ifelse » évite les problèmes liés à un vectorisé « x »

+0

Belle solution. Mais vous pouvez mettre tout ce que vous voulez pour le troisième argument de 'ifelse'. Essayez par exemple '10,99' au lieu de' 0'. – Bhas

+0

@Bhas, c'est vrai, mais 0 est la seule limite correcte à 1 pour cette fonction ;-) En outre, en branchant 10.99 pourrait conduire à des résultats faux lors de l'appel 'intégrer'. – DeeCeeDelux

0

Si vous écrivez votre fonction comme celui-ci

f <- function(x) { 
    r <- ((1.-x)^2)/(abs(1.-x))^(1/3) 
    cat("x=",x,"\n") 
    cat("r=",r,"\n") 
    r 
} 

vous pouvez avoir une idée de ce qui se passe. Essayez cette

z <- integrate(f,lower = 0, upper = 1.6, abs.tol = 1E-7,subdivisions=50) 
z 

Et vous verrez que integrate passe une valeur de 1 pour fonctionner f. Et en divisant par 0 (de 1-x)) donne un NaN. Cela semble être un artefact de integrate.

Avec les limites que vous avez spécifiées, vous sautez par-dessus un point où la fonction n'est pas définie. Vous pouvez éviter cela en faisant

z1 <- integrate(f,lower = 0, upper = 1, abs.tol = 1E-7) 
z1 

z2 <- integrate(f,lower = 1, upper = 1.6, abs.tol = 1E-7) 
z2 
z1$value+z2$value 

qui donne un résultat de

[1] 0.4710361 

Je ne sais pas comment se déplacer cet autre que par ce que vous avez fait ou ce que j'ai essayé.

+0

Mais lors de l'intégration à 1,600001, j'ai aussi passer la valeur indéfinie de 1. Et aussi d'autres valeurs ci-dessus 1 travail très bien ... Alors pourquoi 1.6? –

+0

En résumé, vous ne passez pas la valeur 1 pour 'x'. C'est «intégrer» cela pendant le processus d'approximation de l'intégrale. Apparemment, cela dépend de la limite supérieure de 1,6 en combinaison avec la limite inférieure de 0 et cela est probablement dû à votre fonction spécifique. Regardez la sortie de ma fonction 'f'. – Bhas