View Javadoc
1   /*
2    * Licensed to the Hipparchus project under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The Hipparchus project licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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  }