我试图在Scala
中编写一个函数来计算具有任意多个变量的函数的偏导数。例如
一个变量(常规衍生):
def partialDerivative(f: Double => Double)(x: Double) = { (f(x+0.001)-f(x))/0.001 }
两个变量:
def partialDerivative(c: Char, f: (Double, Double) => Double)(x: Double)(y: Double) = {
if (c == 'x') (f(x+0.0001, y)-f(x, y))/0.0001
else if (c == 'y') (f(x, y+0.0001)-f(x, y))/0.0001
}
我想知道是否有办法写partialDerivative
,其中f
中的变量数量不需要事先知道。
我阅读了一些关于varargs
的博文,但似乎无法提出正确的签名。
这是我试过的。
def func(f: (Double*) => Double)(n: Double*)
但这似乎并不正确。感谢您的帮助。
答案 0 :(得分:0)
Double*
表示f
接受任意Seq
个Double
s,这是不正确的。
我能想到写这样的东西的唯一方法是使用无形Sized
。你需要更多的暗示,并且可能还有一些类型级别的同等性; scala中的类型级编程非常复杂,我没有时间对其进行适当的调试,但它应该给你一些想法:
def partialDerivative[N <: Nat, I <: Nat](f: Sized[Seq[Double], N] => Double)(i: I, xs: Sized[Seq[Double], N])(implicit diff: Diff[I, N]) = {
val (before, atAndAfter) = xs.splitAt(i)
val incrementedAtAndAfter = (atAndAfter.head + 0.0001) +: atAndAfter.tail
val incremented = before ++ incrementedAtAndAfter
(f(incremeted) - f(xs)) / 0.0001
}