1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.hipparchus.ode.nonstiff;
19
20
21 import org.hipparchus.CalculusFieldElement;
22 import org.hipparchus.ode.FieldOrdinaryDifferentialEquation;
23 import org.hipparchus.util.FastMath;
24 import org.hipparchus.util.FieldSinCos;
25 import org.hipparchus.util.MathArrays;
26
27 public class Ellipse<T extends CalculusFieldElement<T>> implements FieldOrdinaryDifferentialEquation<T> {
28
29 private final T a;
30 private final T b;
31 private final T omega;
32
33 Ellipse(final T a, final T b, final T omega) {
34 this.a = a;
35 this.b = b;
36 this.omega = omega;
37 }
38
39 @Override
40 public int getDimension() {
41 return 4;
42 }
43
44 @Override
45 public T[] computeDerivatives(T t, T[] y) {
46 final T[] yDot = MathArrays.buildArray(t.getField(), getDimension());
47 yDot[0] = y[2];
48 yDot[1] = y[3];
49 yDot[2] = y[0].multiply(omega.multiply(omega).negate());
50 yDot[3] = y[1].multiply(omega.multiply(omega).negate());
51 return yDot;
52 }
53
54 public T[] computeTheoreticalState(T t) {
55 final T[] y = MathArrays.buildArray(t.getField(), getDimension());
56 final FieldSinCos<T> sc = FastMath.sinCos(t.multiply(omega));
57 y[0] = a.multiply(sc.cos());
58 y[1] = b.multiply(sc.sin());
59 y[2] = a.multiply(omega).multiply(sc.sin()).negate();
60 y[3] = b.multiply(omega).multiply(sc.cos());
61 return y;
62 }
63
64 }