Как вы используете Apache Commons Math 3.0+ для решения ODE с помощью Jacobian?

Что касается конкретной библиотеки Java для решения ODE с якобианским приближением, предыдущая библиотека 2.2 Apache Commons Math является интуитивно понятной, и есть также несколько наглядных примеров:

Интегрирование обыкновенных дифференциальных уравнений

Но 2.2 устарела сейчас, а последняя библиотека 3.0+

Apache Commons Math 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 не очень информативна и выглядит неоднозначно.

Так что вместо того, чтобы звучать так, будто я жалуюсь на все, я задам конкретный вопрос: как бы вы перекодировали ту же проблему из одного из примеров, продемонстрированных с использованием 2.2 выше, с использованием библиотеки 3.0?

Вот код:

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

1 ответ

Пример BasicCircle был переведен на новый API в JacobianMatricesTest.

Но я бы посоветовал вам задать вопрос в списке рассылки пользователей проекта, где разработчики обычно отвечают быстро.

Другие вопросы по тегам