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 }