有没有一种简单的方法来计算由数据给出的非线性函数的导数?
例如:
我该如何从由 ´x´ 和 ´ycs´ 给出的函数计算导函数?
例如:
x = 1 / c(1000:1)
y = x^-1.5
ycs = cumsum(y)
plot (x, ycs, log="xy")
我该如何从由 ´x´ 和 ´ycs´ 给出的函数计算导函数?
x = 1 / c(1000:1)
y = x^-1.5
ycs = cumsum(y)
plot (x, ycs, log="xy")
我原本想提供一个光滑样条拟合的例子,然后进行导数预测。在这种情况下,结果非常类似于@dbaupp所描述的diff计算:
也可以建议使用光滑样条拟合的例子,接着进行导数预测。 在这种情况下,结果与@dbaupp所描述的diff计算非常相似:
spl <- smooth.spline(x, y=ycs)
pred <- predict(spl)
plot (x, ycs, log="xy")
lines(pred, col=2)
ycs.prime <- diff(ycs)/diff(x)
pred.prime <- predict(spl, deriv=1)
plot(ycs.prime)
lines(pred.prime$y, col=2)
x=-10:10
y=x^2
plot(x, y, type = 'l', col='blue', ylim=c(-10,10))
lines(x = x, y = c(NA, diff(y)/diff(x)), type = 'l', col='red')
abline(v=0, h=0)
abline(a = 0, b = 2)
- Elad663x=seq(-10,10,length.out = 100)
。 - Marc in the boxspl <- smooth.spline(x, y=y); lines(x=x, y=predict(spl, deriv=1)$y)
。 - Marc in the box如果您不非常小心,从原始数据生成导数是很有风险的。这个过程之所以被称为“误差倍增”,并非没有原因。除非您知道数据的噪声内容并采取一些措施(例如样条),在求导之前去除噪声,否则您可能会得到一个令人生畏的曲线。
函数的导数是dy/dx,可以近似表示为Δy/Δx,即“y的变化量除以x的变化量”。这可以用R语言表示:
ycs.prime <- diff(ycs)/diff(x)
现在,ycs.prime
包含每个 x
处函数导数的近似值: 但它是一个长度为999的向量,因此在进行任何分析或绘图时,您需要缩短 x
(即使用 x[1:999]
或 x[2:1000]
)。
还可以使用 pracma 包中的 gradient
方法。
grad <- pracma::gradient(ycs, h1 = x)
plot(grad, col = 1)