关于使用雅可比近似求解 ODE 的特定 Java 库,以前的 Apache Commons Math 库 2.2 很直观,也有一些清晰的示例:
但是现在不推荐使用 2.2,最近的库 3.0+
特别是包:
org.apache.commons.math3.ode
org.apache.commons.math3.ode.events
org.apache.commons.math3.ode.nonstiff
是替代品,但似乎要复杂得多。我认为新的 ODE 版本的动机是对数据结构和方法进行概括,但很难理解某些类是如何一起使用的(例如 MainStateJacobianProvider、ExpandableStatefulODE、ParameterizedODE),而且在任何地方都没有它的例子Apache 没有更新他们的信息页面。API 文档的信息量不是很大,而且似乎也很模糊。
因此,我不会听起来像是在抱怨所有事情,而是提出一个具体的问题,您将如何使用 3.0 库从上面使用 2.2 演示的示例之一重新编码相同的问题?
这是代码:
public class BasicCircleODE implements ParameterizedODE {
private double[] c;
private double omega;
public BasicCircleODE(double[] c, double omega) {
this.c = c;
this.omega = omega;
}
public int getDimension() {
return 2;
}
public void computeDerivatives(double t, double[] y, double[] yDot) {
yDot[0] = omega * (c[1] - y[1]);
yDot[1] = omega * (y[0] - c[0]);
}
public int getParametersDimension() {
// we are only interested in the omega parameter
return 1;
}
public void setParameter(int i, double value) {
omega = value;
}
}
double[] hY = new double[] { 0.001, 0.001 };
double[] hP = new double[] { 1.0e-6 };
FirstOrderIntegratorWithJacobians integrator = new FirstOrderIntegratorWithJacobians(dp853, ode, hY, hP);
integrator.integrate(t0, y0, dy0dp, t, y, dydy0, dydp);