我有一组数据点,我想绘制“积分”。
例如:
x = seq(from=0, to=9, by=0.05)
y = sin(x)
如何在0
到x
的间隔内绘制从0
到10
的积分?其中,积分是由曲线和y=0
限定的区域。
这当然应该看起来非常像1 - cos(x)
的情节,但我们假设我们不知道y = f(x)
究竟是什么。
我唯一知道如何做到这一点似乎有道理:
spl = smooth.spline(x, y)
但我不知道下一步该做什么。
编辑:这不是曲线下阴影的重复,因为有一点需要减去y = 0以下的区域,而另一个不是显示阴影区域,而是关于构建一个整体的函数...
答案 0 :(得分:1)
我相信你想实现这个目标:
请注意,红线和蓝线不相同 - 这取决于您计算面积的点数。如果在第一行代码中增加数字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)