List of usage examples for org.apache.commons.math3.analysis.differentiation DerivativeStructure subtract
public DerivativeStructure subtract(final DerivativeStructure a) throws DimensionMismatchException
From source file:de.tuberlin.uebb.jdae.examples.FactorialEquation.java
private final DerivativeStructure dfactorial(final DerivativeStructure ds) { if (ds.getValue() <= 1.0) { final DerivativeStructure divide = ds.divide(ds); return divide; } else/*from w ww. j ava 2 s .com*/ return ds.multiply(dfactorial(ds.subtract(1.0))); }
From source file:org.orekit.bodies.OneAxisEllipsoid.java
/** Transform a Cartesian point to a surface-relative point. * @param point Cartesian point//from w ww . j a va 2s. c o m * @param frame frame in which Cartesian point is expressed * @param date date of the computation (used for frames conversions) * @return point at the same location but as a surface-relative point, * using time as the single derivation parameter * @exception OrekitException if point cannot be converted to body frame */ public FieldGeodeticPoint<DerivativeStructure> transform(final PVCoordinates point, final Frame frame, final AbsoluteDate date) throws OrekitException { // transform point to body frame final Transform toBody = frame.getTransformTo(bodyFrame, date); final PVCoordinates pointInBodyFrame = toBody.transformPVCoordinates(point); final FieldVector3D<DerivativeStructure> p = pointInBodyFrame.toDerivativeStructureVector(2); final DerivativeStructure pr2 = p.getX().multiply(p.getX()).add(p.getY().multiply(p.getY())); final DerivativeStructure pr = pr2.sqrt(); final DerivativeStructure pz = p.getZ(); // project point on the ellipsoid surface final TimeStampedPVCoordinates groundPoint = projectToGround( new TimeStampedPVCoordinates(date, pointInBodyFrame), bodyFrame); final FieldVector3D<DerivativeStructure> gp = groundPoint.toDerivativeStructureVector(2); final DerivativeStructure gpr2 = gp.getX().multiply(gp.getX()).add(gp.getY().multiply(gp.getY())); final DerivativeStructure gpr = gpr2.sqrt(); final DerivativeStructure gpz = gp.getZ(); // relative position of test point with respect to its ellipse sub-point final DerivativeStructure dr = pr.subtract(gpr); final DerivativeStructure dz = pz.subtract(gpz); final double insideIfNegative = g2 * (pr2.getReal() - ae2) + pz.getReal() * pz.getReal(); return new FieldGeodeticPoint<DerivativeStructure>(DerivativeStructure.atan2(gpz, gpr.multiply(g2)), DerivativeStructure.atan2(p.getY(), p.getX()), DerivativeStructure.hypot(dr, dz).copySign(insideIfNegative)); }
From source file:org.orekit.forces.BoxAndSolarArraySpacecraft.java
/** {@inheritDoc} */ public FieldVector3D<DerivativeStructure> dragAcceleration(final AbsoluteDate date, final Frame frame, final FieldVector3D<DerivativeStructure> position, final FieldRotation<DerivativeStructure> rotation, final DerivativeStructure mass, final double density, final FieldVector3D<DerivativeStructure> relativeVelocity) throws OrekitException { // relative velocity in spacecraft frame final FieldVector3D<DerivativeStructure> v = rotation.applyTo(relativeVelocity); // solar array contribution final FieldVector3D<DerivativeStructure> solarArrayFacet = new FieldVector3D<DerivativeStructure>( solarArrayArea, getNormal(date, frame, position, rotation)); DerivativeStructure sv = FieldVector3D.dotProduct(v, solarArrayFacet).abs(); // body facets contribution for (final Facet facet : facets) { final DerivativeStructure dot = FieldVector3D.dotProduct(v, facet.getNormal()); if (dot.getValue() < 0) { // the facet intercepts the incoming flux sv = sv.subtract(dot.multiply(facet.getArea())); }/*from w w w .j a v a 2 s .c om*/ } return new FieldVector3D<DerivativeStructure>(sv.multiply(density * dragCoeff / 2.0).divide(mass), relativeVelocity); }
From source file:org.orekit.forces.BoxAndSolarArraySpacecraft.java
/** Compute contribution of one facet to force. * <p>This method implements equation 8-44 from David A. Vallado's * Fundamentals of Astrodynamics and Applications, third edition, * 2007, Microcosm Press.</p>//www .j a v a 2s.co m * @param normal facet normal * @param area facet area * @param fluxSat radiation pressure flux in spacecraft frame * @param dot dot product of facet and fluxSat (must be negative) * @param specularReflectionCoeffDS specular reflection coefficient * @param diffuseReflectionCoeffDS diffuse reflection coefficient * @return contribution of the facet to force in spacecraft frame */ private FieldVector3D<DerivativeStructure> facetRadiationAcceleration(final Vector3D normal, final double area, final Vector3D fluxSat, final double dot, final DerivativeStructure specularReflectionCoeffDS, final DerivativeStructure diffuseReflectionCoeffDS) { final double psr = fluxSat.getNorm(); // Vallado's equation 8-44 uses different parameters which are related to our parameters as: // cos (phi) = -dot / (psr * area) // n = facet / area // s = -fluxSat / psr final DerivativeStructure cN = diffuseReflectionCoeffDS.divide(3) .subtract(specularReflectionCoeffDS.multiply(dot / psr)).multiply(2 * area * dot); final DerivativeStructure cS = specularReflectionCoeffDS.subtract(1).multiply(area * dot / psr); return new FieldVector3D<DerivativeStructure>(cN, normal, cS, fluxSat); }
From source file:org.orekit.forces.SphericalSpacecraft.java
/** {@inheritDoc} */ public FieldVector3D<DerivativeStructure> radiationPressureAcceleration(final AbsoluteDate date, final Frame frame, final Vector3D position, final Rotation rotation, final double mass, final Vector3D flux, final String paramName) throws OrekitException { final DerivativeStructure absorptionCoeffDS; final DerivativeStructure specularReflectionCoeffDS; if (ABSORPTION_COEFFICIENT.equals(paramName)) { absorptionCoeffDS = new DerivativeStructure(1, 1, 0, absorptionCoeff); specularReflectionCoeffDS = new DerivativeStructure(1, 1, specularReflectionCoeff); } else if (REFLECTION_COEFFICIENT.equals(paramName)) { absorptionCoeffDS = new DerivativeStructure(1, 1, absorptionCoeff); specularReflectionCoeffDS = new DerivativeStructure(1, 1, 0, specularReflectionCoeff); } else {// w w w.j av a 2 s. com throw new OrekitException(OrekitMessages.UNSUPPORTED_PARAMETER_NAME, paramName, ABSORPTION_COEFFICIENT + ", " + REFLECTION_COEFFICIENT); } final DerivativeStructure kP = absorptionCoeffDS.subtract(1).multiply(specularReflectionCoeffDS.subtract(1)) .multiply(4.0 / 9.0).add(1).multiply(crossSection); return new FieldVector3D<DerivativeStructure>(kP.divide(mass), flux); }
From source file:org.orekit.propagation.analytical.EcksteinHechlerPropagator.java
/** Convert circular parameters <em>with derivatives</em> to Cartesian coordinates. * @param date date of the orbital parameters * @param parameters circular parameters (a, ex, ey, i, raan, alphaM) * @return Cartesian coordinates consistent with values and derivatives *//* w w w . j a v a 2 s . co m*/ private TimeStampedPVCoordinates toCartesian(final AbsoluteDate date, final DerivativeStructure[] parameters) { // evaluate coordinates in the orbit canonical reference frame final DerivativeStructure cosOmega = parameters[4].cos(); final DerivativeStructure sinOmega = parameters[4].sin(); final DerivativeStructure cosI = parameters[3].cos(); final DerivativeStructure sinI = parameters[3].sin(); final DerivativeStructure alphaE = meanToEccentric(parameters[5], parameters[1], parameters[2]); final DerivativeStructure cosAE = alphaE.cos(); final DerivativeStructure sinAE = alphaE.sin(); final DerivativeStructure ex2 = parameters[1].multiply(parameters[1]); final DerivativeStructure ey2 = parameters[2].multiply(parameters[2]); final DerivativeStructure exy = parameters[1].multiply(parameters[2]); final DerivativeStructure q = ex2.add(ey2).subtract(1).negate().sqrt(); final DerivativeStructure beta = q.add(1).reciprocal(); final DerivativeStructure bx2 = beta.multiply(ex2); final DerivativeStructure by2 = beta.multiply(ey2); final DerivativeStructure bxy = beta.multiply(exy); final DerivativeStructure u = bxy.multiply(sinAE) .subtract(parameters[1].add(by2.subtract(1).multiply(cosAE))); final DerivativeStructure v = bxy.multiply(cosAE) .subtract(parameters[2].add(bx2.subtract(1).multiply(sinAE))); final DerivativeStructure x = parameters[0].multiply(u); final DerivativeStructure y = parameters[0].multiply(v); // canonical orbit reference frame final FieldVector3D<DerivativeStructure> p = new FieldVector3D<DerivativeStructure>( x.multiply(cosOmega).subtract(y.multiply(cosI.multiply(sinOmega))), x.multiply(sinOmega).add(y.multiply(cosI.multiply(cosOmega))), y.multiply(sinI)); // dispatch derivatives final Vector3D p0 = new Vector3D(p.getX().getValue(), p.getY().getValue(), p.getZ().getValue()); final Vector3D p1 = new Vector3D(p.getX().getPartialDerivative(1), p.getY().getPartialDerivative(1), p.getZ().getPartialDerivative(1)); final Vector3D p2 = new Vector3D(p.getX().getPartialDerivative(2), p.getY().getPartialDerivative(2), p.getZ().getPartialDerivative(2)); return new TimeStampedPVCoordinates(date, p0, p1, p2); }
From source file:org.orekit.propagation.analytical.EcksteinHechlerPropagator.java
/** Computes the eccentric latitude argument from the mean latitude argument. * @param alphaM = M + mean latitude argument (rad) * @param ex e cos(), first component of circular eccentricity vector * @param ey e sin(), second component of circular eccentricity vector * @return the eccentric latitude argument. *//* w w w .ja v a 2 s. com*/ private DerivativeStructure meanToEccentric(final DerivativeStructure alphaM, final DerivativeStructure ex, final DerivativeStructure ey) { // Generalization of Kepler equation to circular parameters // with alphaE = PA + E and // alphaM = PA + M = alphaE - ex.sin(alphaE) + ey.cos(alphaE) DerivativeStructure alphaE = alphaM; DerivativeStructure shift = alphaM.getField().getZero(); DerivativeStructure alphaEMalphaM = alphaM.getField().getZero(); DerivativeStructure cosAlphaE = alphaE.cos(); DerivativeStructure sinAlphaE = alphaE.sin(); int iter = 0; do { final DerivativeStructure f2 = ex.multiply(sinAlphaE).subtract(ey.multiply(cosAlphaE)); final DerivativeStructure f1 = alphaM.getField().getOne().subtract(ex.multiply(cosAlphaE)) .subtract(ey.multiply(sinAlphaE)); final DerivativeStructure f0 = alphaEMalphaM.subtract(f2); final DerivativeStructure f12 = f1.multiply(2); shift = f0.multiply(f12).divide(f1.multiply(f12).subtract(f0.multiply(f2))); alphaEMalphaM = alphaEMalphaM.subtract(shift); alphaE = alphaM.add(alphaEMalphaM); cosAlphaE = alphaE.cos(); sinAlphaE = alphaE.sin(); } while ((++iter < 50) && (FastMath.abs(shift.getValue()) > 1.0e-12)); return alphaE; }