计算函数在scala点的导数

kpbwa7wx  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(328)

我试图计算一个给定函数在某一点的导数的数值近似值。它应该非常简单,即,$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 )是否可以以更优雅(多态)的方式实现而不需要太多开销?
谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题