2017-05-28 219 views
0

因此,我有一个有条件地定义的函数,如下面的R代码所示,它是-1和t之间的积分。绘制反函数与R

f <- function(x) ifelse((x<=1 & x>=-1),3/4*(1-x^2),0) 
F <- function(t) integrate(Vectorize(f),-1,t)$value 

使用:

plot(Vectorize(F),-2,2); 

我得到F.

的曲线

现在我要绘制F的反函数,所以做了一些研究之后,我发现了uniroot功能试图用这种方式:

Finv <- function(s) uniroot(function(t) F(t) - s, lower=-1,upper=1) 

解决函数F(x)= Y在[-1,1]。 但想要绘制结果时:

plot(Vectorize(Finv),-2,2) 

我不断收到以下错误:

Error in uniroot(function(t) F(t) - s, lower = -1, upper = 1) : 
     f() values at end points not of opposite sign 

我不明白是什么问题?

回答

1

对于[-1,1]中的x,F取值为0到1.因此,Finv仅在[0,1]上定义。你无法将其绘制[-2,2]。如果你限制你的情节到适当的领域,它会正常工作。

plot(Vectorize(Finv),0,1) 
0

而且不要忘记在uniroot月底的$根,以获得特定的值:

Finv <- function(s) uniroot(function(t) F(t) - s, lower=-1,upper=1)$root 

所以它看起来应该(和工作)是这样的:

f <- function(x) ifelse((x<=1 & x>=-1),3/4*(1-x^2),0) 
F <- function(t) integrate(Vectorize(f),-1,t)$value 

Finv <- function(s) uniroot(function(t) F(t) - s, lower=-1,upper=1)$root 

plot(Vectorize(Finv),0,1)