Java-使用Apache Commons数学库进行派生计算

2019年10月30日 24点热度 0条评论

我在使用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数学库进行微分/推导有任何经验,或者有人知道其他可以帮助我的库/框架吗?

谢谢

解决方案如下:

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

用户可以通过多种方式创建UnivariateDifferentiableFunction接口的实现。第一种方法是直接使用DerivativeStructure的适当方法直接编写它,以计算加法,减法,正弦,余弦...这通常是很简单的,并且无需记住区分规则:用户代码仅表示功能本身,差异将在引擎盖下自动计算。第二种方法是编写经典的UnivariateFunction并将其传递给UnivariateFunctionDifferentiator接口的现有实现,以检索同一函数的差异版本。第一种方法更适合于用户已经控制了所有基础代码的小型功能。第二种方法更适合使用DerivativeStructure API编写笨重的大型函数,或者用户无法控制全部底层代码的函数(例如,调用外部库的函数)。

使用第一个想法。

// 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));