1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  package org.apache.commons.math4.legacy.ode.nonstiff;
19  
20  import org.apache.commons.math4.legacy.core.Field;
21  import org.apache.commons.math4.legacy.core.RealFieldElement;
22  import org.apache.commons.math4.legacy.ode.FirstOrderFieldDifferentialEquations;
23  import org.apache.commons.math4.legacy.ode.FieldODEState;
24  import org.apache.commons.math4.legacy.ode.FieldODEStateAndDerivative;
25  import org.apache.commons.math4.legacy.ode.events.Action;
26  import org.apache.commons.math4.legacy.ode.events.FieldEventHandler;
27  import org.apache.commons.math4.legacy.core.MathArrays;
28  
29  
30  public class StepFieldProblem<T extends RealFieldElement<T>>
31      implements FirstOrderFieldDifferentialEquations<T>, FieldEventHandler<T> {
32  
33      public StepFieldProblem(Field<T> field, T rateBefore, T rateAfter, T switchTime) {
34          this.field      = field;
35          this.rateAfter  = rateAfter;
36          this.switchTime = switchTime;
37          setRate(rateBefore);
38      }
39  
40      @Override
41      public T[] computeDerivatives(T t, T[] y) {
42          T[] yDot = MathArrays.buildArray(field, 1);
43          yDot[0] = rate;
44          return yDot;
45      }
46  
47      @Override
48      public int getDimension() {
49          return 1;
50      }
51  
52      public void setRate(T rate) {
53          this.rate = rate;
54      }
55  
56      @Override
57      public void init(T t0, T[] y0, T t) {
58      }
59  
60      @Override
61      public void init(FieldODEStateAndDerivative<T> state0, T t) {
62      }
63  
64      @Override
65      public Action eventOccurred(FieldODEStateAndDerivative<T> state, boolean increasing) {
66          setRate(rateAfter);
67          return Action.RESET_DERIVATIVES;
68      }
69  
70      @Override
71      public T g(FieldODEStateAndDerivative<T> state) {
72          return state.getTime().subtract(switchTime);
73      }
74  
75      @Override
76      public FieldODEState<T> resetState(FieldODEStateAndDerivative<T> state) {
77          return state;
78      }
79  
80      private Field<T> field;
81      private T        rate;
82      private T        rateAfter;
83      private T        switchTime;
84  }