Hello, As you may have seen, I have implemented a new feature in [math] last few days. It is an extended integrator for ODE that in addition to state y() also provides its jacobians with respect to initial state dy(t)/dy0 and with respect to some ODE parameters dy(t)/dp.
The underlying algorithm is simply to extend the ODE problem with a few variational equations, so if you start with an y(t) state that has dimension 6 for example, and you have 3 parameters you will end up with a compound state that has dimension 6 + (6 * 6) + (6 * 3) = 60. One the state has been extended and the additional equations have been set up, the problem is a classical Initial Value Problem whci can be handled by all the existing integrators we have. So this feature consists mainly in a bunch of adaptor classes to perform the state versus compound state mapping. There are adaptors for the ODE problem, the step handlers, the step interpolators and the events handlers. For now, the implementation is based on a top level class: FirstOrderIntegratorWithJacobians and five interfaces: StepHandlerWithJacobians, StepInterpolatorWithJacobians, EventHandlerWithJacobians, ParameterizedODE and ODEWithJacobians. The user typically has to implement StepHandlerWithJacobians if he want to monitor the integration process at each step, EventHandlerWithJacobians if he needs to introduce some discrete event in the otherwise continuous integration process and either ParameterizedODE or ODEWithJacobians to describe the problem he wants to integrate. The FirstOrderIntegratorWithJacobians performs all wrapping by itself and mimics many of the original FirstOrderIntegrator interface. Another choice would be to remove the FirstOrderIntegratorWithJacobians class and change the adaptors classes to be user visible (StepHandlerAdaptor, EventHandlerAdaptor, ODEAdaptor). In this case, the user would need to wrap his implementations of the jacobians enabled interface into the adaptors and pass them to a classical integrator. On the one hand, this choice would remove duplication of the integrator methods in a separate class, and would allow better management of handlers by users. Users may also not use adaptors for step handlers or event handlers if they don't explicitly need the jacobians, using only the irst elements of the compound state without any data copyin. On the other hand it will force the user to add the adaptors Here are examples of user code in both cases: Current implementation: FirstOrderIntegrator rawIntegrator = new XyzIntegrator(...); ODEWithJacobians ode = new MyProblem(...); FirstOrderIntegratorWithJacobians integrator = new FirstOrderIntegratorWithJacobians(rawIntegrator, myProblem); integrator.addEventHandler(new MyEventHandler(...), max, epsilon, count); integrator.addStepHandler(new MyStepHandler(...)); integrator.integrate(t0, y0, dy0dp, t, y, dydy0, dydp); Implementation with public adaptors: FirstOrderIntegrator integrator = new XyzIntegrator(...); ODEWithJacobians ode = new MyProblem(...); integrator.addEventHandler(new EventAdaptor(new MyEventHandler(...)), max, epsilon, count); integrator.addStepHandler(new StepAdaptor(new MyStepHandler(...))); StateAdaptor sa = new StateAdaptor(y0, dy0dp); double[] y = sa.getCompoundStateReference(); integrator.integrate(ode, t0, y t, y); dydy0 = sa.getDyDy0(); dydp = sa.getDyDp(); My current preference is to have visible adaptors. It seems cleaner from a design perspective, and not too cumbersome for users. What do you think ? Luc --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org