2016-08-01 1 views
0

を存在するが、私はRで、次の積分を計算したいと思います:非有限関数値ソリューションは

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

そして、私はこのエラーを取得する:

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

しかし、私は最大1.600001または1.599999を積分すると、それは働き、0.4710365と0.4710357を得ます。

しかし、そこにポイント1.6でこの機能を備えた特別なことは何もありません...だから、それはすべてのアイデアR.

でいくつかの奇妙な数値問題すべきですか?

答えて

0

、私は次の解決のために行くだろう:

> 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' 'x' は

+0

良い解決策。しかし、あなたは 'ifelse'の3番目の議論のために好きなものを置くことができます。試してみてください'0'ではなく '10.99'となる。 – Bhas

+0

@Bhas、それは当てはまりますが、この関数の1では、0が唯一の正しい限界です;-)さらに、10.99をプラグインすると、 'integrate'を呼び出すときに偽の結果になることがあります。 – DeeCeeDelux

0

は、あなたがこの

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

のようなあなたの機能を記述する場合、あなたは何が起こっているかのいくつかのアイデアを得ることができます。 この

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

を試してみて、あなたはintegratefを機能させる1の値を渡していることがわかります。 01-x))で除算するとNaNとなります。これはintegrateというアーティファクトのようです。

指定した制限で、関数が未定義のポイントを飛び越しています。 あなたは

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 

を行うことで、私が何をやったか、私が試したことによってよりも、この他の周りを取得する方法を知っているだろう

[1] 0.4710361 

の結果を与えることを避けることができます。 @ Bhasの答えに沿って

+0

しかし、また1.600001までの統合、I 1の未定義の値を渡します。また、1より上の他の値もうまくいきます...なぜ1.6ですか? –

+0

あなたは 'x'に値1を渡しません。それは積分を近似する過程でそれを行う「積分」されている。明らかに上限値1.6と下限値0との組み合わせに依存しており、これはあなたの特定の機能によって引き起こされた可能性が最も高いです。私の関数 'f'の出力を見てください。 – Bhas

関連する問題