Example usage for org.apache.commons.math3.analysis.differentiation DerivativeStructure subtract

List of usage examples for org.apache.commons.math3.analysis.differentiation DerivativeStructure subtract

Introduction

In this page you can find the example usage for org.apache.commons.math3.analysis.differentiation DerivativeStructure subtract.

Prototype

public DerivativeStructure subtract(final DerivativeStructure a) throws DimensionMismatchException 

Source Link

Document

'-' operator.

Usage

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;

}