2016-08-01 37 views
0

Ich möchte das folgende Integral in R berechnen:Nicht endlicher Funktionswert mit integrieren() R obwohl Lösung existiert

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

Und ich bekomme diese Fehlermeldung:

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

Wenn jedoch Ich integriere bis zu 1.600001 oder 1.599999, es funktioniert und ergibt 0.4710365 und 0.4710357.

Aber es ist nichts Besonderes mit dieser Funktion an dem Punkt 1.6 ... So sollte es einige seltsame numerische Problem in R.

Irgendwelche Ideen sein?

Antwort

0

Im Einklang mit @ Bhas Antwort, würde ich für die folgende Lösung gehen:

> 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‘ zu einem vektorisiert verbundenen Problemen vermeiden ‚x‘

+0

Schöne Lösung. Aber Sie können alles, was Sie mögen, für das dritte Argument von "ifelse" verwenden. Versuchen Sie z.B. '10.99' anstelle von' 0'. – Bhas

+0

@Bhas, das stimmt, aber 0 ist die einzige richtige Grenze bei 1 für diese Funktion ;-) Außerdem kann das Einstecken von 10.99 zu falschen Ergebnissen führen, wenn 'integrate' aufgerufen wird. – DeeCeeDelux

0

Wenn Sie Ihre Funktion wie diese

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

schreiben Sie eine Vorstellung davon bekommen, was passiert. Versuchen Sie, diese

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

Und Sie werden sehen, dass integrate einen Wert von 1 geht f zu funktionieren. Und dividiert durch 0 (von 1-x)) ergibt NaN. Dies scheint ein Artefakt von integrate zu sein.

Mit den von Ihnen angegebenen Grenzen springen Sie über einen Punkt, an dem die Funktion nicht definiert ist. Sie können das vermeiden, indem

tun
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 

, die ein Ergebnis von

[1] 0.4710361 

gibt würde ich nicht wissen, wie dieses andere zu bekommen, als durch das, was Sie getan haben oder was habe ich versucht.

+0

Aber bei der Integration von bis zu 1,600001, habe ich auch Übergeben Sie den undefinierten Wert von 1. Und auch andere Werte über 1 funktionieren gut ... Also warum 1,6? –

+0

Kurz gesagt, Sie übergeben den Wert 1 für 'x' nicht. Es ist das "Integrieren", das während des Annäherns des Integrals geschieht. Offensichtlich hängt es von der Obergrenze von 1,6 in Verbindung mit der Untergrenze von 0 ab und dies ist höchstwahrscheinlich nur durch Ihre spezifische Funktion bedingt. Schau dir die Ausgabe meiner Funktion 'f' an. – Bhas