我试图计算一个给定函数在某一点的导数的数值近似值。它应该非常简单,即,$f'(a)=\lim\限制{\delta\到0}\frac{f(a+\delta)-f(a-\delta)}{2\delta}$。
我昨天刚开始用微风。我希望这两种方法都能奏效 DenseVector
以及 DenseMatrix
(不知道为什么微风中一定有这两个,但无论如何)所以我想我应该用 Tensor
. 我想我可以这样做:
def deriv[K,Double](f: UFunc, a: Tensor[K,Double]): Tensor[K,Double] = {
val delta = 0.0001d
(f(a + delta) - f(a - delta)) / (2*delta)
}
但我有以下错误:
cmd36.sc:5: could not find implicit value for parameter op: breeze.linalg.operators.OpAdd.Impl2[breeze.linalg.Tensor[K,Double],Double,That]
(f(a + delta) - f(a - delta)) / (2*delta)
^
cmd36.sc:5: could not find implicit value for parameter op: breeze.linalg.operators.OpSub.Impl2[breeze.linalg.Tensor[K,Double],Double,That]
(f(a + delta) - f(a - delta)) / (2*delta)
^
Compilation Failed
我试着为他们写具体的版本 DenseVector
以及 DenseMatrix
也没有成功。但是当我改变我使用的函数的时间和参数的类型时,我得到了我所期望的。
def deriv(f: DenseVector[Double] => DenseVector[Double], a: DenseVector[Double]): DenseVector[Double] = {
val delta = 0.001d
(f(a + delta) - f(a - delta)) / (2.0*delta)
}
def deriv(f: DenseMatrix[Double] => DenseMatrix[Double], a: DenseMatrix[Double]): DenseMatrix[Double] = {
val delta = 0.001d
(f(a + delta) - f(a - delta)) / (2.0*delta)
}
上面的代码按预期编译和工作。但我必须写两次完全相同的代码。
任何人都可以:
(a) 解释为什么我第一次尝试( UFunc
+ Tensor
)不起作用?
(b) 演示如何( deriv
)是否可以以更优雅(多态)的方式实现而不需要太多开销?
谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!