使用R

时间:2017-05-28 18:16:55

标签: r function inverse

所以我有一个有条件定义的函数,如下面的R代码所示,它是-1和t之间的集成。

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)

解决[-1,1]中的函数F(x)= y。 但是当试图绘制结果时:

 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

我无法理解这是什么问题?

2 个答案:

答案 0 :(得分:1)

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

plot(Vectorize(Finv),0,1) 

答案 1 :(得分:0)

并且不要在uniroot结束时忘记$ root以获取特定值:

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)