用任意多个变量计算函数的偏导数的函数

时间:2014-10-28 23:58:09

标签: scala functional-programming variadic-functions

我试图在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*)

但这似乎并不正确。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Double*表示f接受任意SeqDouble 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
}