2014-10-28 79 views
1

我想在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

Double*表示f接受Double的任意Seq,這是不正確的。

我能想到寫這樣的東西的唯一方法是使用無形Sized。你將需要比這更多的暗示,並且可能還有一些類型級別的平等。在斯卡拉的類型級編程是相當複雜的,我沒有時間來正確調試,但它應該給你一些想法:

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 
}