4

我在使用 apache commons 数学库时遇到问题。
我只想创建像 f(x) = 4x^2 + 2x 这样的函数,我想计算这个函数的导数
--> f'(x) = 8x + 2

我阅读了有关差异化的文章(http://commons.apache.org/proper/commons-math/userguide/analysis.html,第 4.7 节)。
有一个我不明白的例子:

int params = 1;
int order = 3;
double xRealValue = 2.5;
DerivativeStructure x = new DerivativeStructure(params, order, 0, xRealValue);
DerivativeStructure y = f(x);                    //COMPILE ERROR
System.out.println("y    = " + y.getValue();
System.out.println("y'   = " + y.getPartialDerivative(1);
System.out.println("y''  = " + y.getPartialDerivative(2);
System.out.println("y''' = " + y.getPartialDerivative(3);

在第 5 行,当然会发生编译错误。该函数f(x)被调用但未定义。我做错了什么?
有没有人对apache commons数学库的微分/推导有任何经验,或者有人知道另一个可以帮助我的库/框架吗?

谢谢

4

2 回答 2

4

在该示例下面的段落中,作者描述了创建DerivativeStructures 的方法。这不是魔术。在您引用的示例中,应该有人编写 function f。嗯,这不是很清楚。

用户可以通过多种方式创建 UnivariateDifferentiableFunction 接口的实现。第一种方法是直接使用 DerivativeStructure 中的适当方法简单地编写它来计算加法、减法、正弦、余弦……这通常非常简单,无需记住微分规则:用户代码仅代表函数本身,差异将在引擎盖下自动计算。第二种方法是编写一个经典的 UnivariateFunction 并将其传递给 UnivariateFunctionDifferentiator 接口的现有实现,以检索同一函数的不同版本。第一种方法更适合用户已经控制所有底层代码的小功能。

使用第一个想法。

// Function of 1 variable, keep track of 3 derivatives with respect to that variable,
// use 2.5 as the current value.  Basically, the identity function.
DerivativeStructure x = new DerivativeStructure(1, 3, 0, 2.5);
// Basically, x --> x^2.
DerivativeStructure x2 = x.pow(2);
//Linear combination: y = 4x^2 + 2x
DerivativeStructure y = new DerivativeStructure(4.0, x2, 2.0, x);
System.out.println("y    = " + y.getValue());
System.out.println("y'   = " + y.getPartialDerivative(1));
System.out.println("y''  = " + y.getPartialDerivative(2));
System.out.println("y''' = " + y.getPartialDerivative(3));
于 2013-05-27T23:30:22.767 回答
3

Apache 邮件列表中的以下线程似乎说明了如何定义 UnivariateDifferentiableFunction 的导数的两种可能方式。我正在添加一个新答案,因为我无法评论前一个答案(声誉不足)。

该函数使用的样本规格为 f(x) = x^2。

(1) 使用衍生结构:

public DerivativeStructure value(DerivativeStructure t) {
     return t.multiply(t);
}

(2) 通过编写经典的 UnivariateFunction:

public UnivariateRealFunction derivative() {
    return new UnivariateRealFunction() {
          public double value(double x) {
                // example derivative
                return 2.*x;
          }
     }
}

如果我理解得很好,第一种情况的优点是不需要像第二种情况那样手动获取导数。如果导数是已知的,那么定义 DerivativeStructure 应该没有优势,对吧?我想到的应用是 Newton-Raphson 求解器,通常需要知道函数值及其导数。

上述网站上提供了完整的示例(作者是 Thomas Neidhart 和 Franz Simons)。欢迎任何进一步的评论!

于 2014-11-01T06:42:07.457 回答