绘制R中一组x和y值的曲线下面积(整数)

时间:2017-10-18 15:38:05

标签: r integral

我有一组数据点,我想绘制“积分”。

例如:

x = seq(from=0, to=9, by=0.05)
y = sin(x)

如何在0x的间隔内绘制从010的积分?其中,积分是由曲线和y=0限定的区域。

这当然应该看起来非常像1 - cos(x)的情节,但我们假设我们不知道y = f(x)究竟是什么。

我唯一知道如何做到这一点似乎有道理:

spl = smooth.spline(x, y)

但我不知道下一步该做什么。

编辑:这不是曲线下阴影的重复,因为有一点需要减去y = 0以下的区域,而另一个不是显示阴影区域,而是关于构建一个整体的函数...

2 个答案:

答案 0 :(得分:1)

我相信你想实现这个目标:

enter image description here

请注意,红线和蓝线不相同 - 这取决于您计算面积的点数。如果在第一行代码中增加数字500,则绘图上的线条将更接近。 代码:

x <- seq(from=0, to=10, length.out = 500)
n <- rep(1, length(x))
y <- sin(x)

plot(x,y, type="l")
lines(x, 1-cos(x), col="red")
lines(x, cumsum(y*x/cumsum(n)), col="blue")
legend(x="bottomright", 
       col=c("black","red", "blue"), 
       legend=c("sin", "1-cos", "integral"),
       lty=1)

答案 1 :(得分:0)

@Maciej Pitucha的答案也很好,但我最终在我最初试图用smooth.spline()做的事情上糊里糊涂,似乎对我的实际数据更有效。

test.x = seq(from=0, to=9, by=0.05)
test.y = sin(x)
spl = smooth.spline(y=test.y, x=test.x)
f = function(x) {predict(spl, x)$y}
f.int = function(x) {integrate(f, lower=0, upper=x)$value}
f.int.vec = Vectorize(f.int, vectorize.args='x')

plot(test.x, test.y, type="l", ylim = c(-1,2))
lines(test.x, 1-cos(test.x), col="red")
lines(test.x, f.int.vec(test.x), col="blue")
legend(x="bottomright", 
       col=c("black","red", "blue"), 
       legend=c("sin", "1-cos", "integral"),
       lty=1)

enter image description here