Skip to content

eom

Equations of motion via the principle of least action.

compute_eom(lagrangian, inf_work, variables) variation → simplify → IBP → expand → extract coefficients

separate_variations(expr, variation_vectors) extract coefficient of each variation vector from the action integral

compute_eom(lagrangian, inf_work, variables)

Compute equations of motion using the principle of least action.

  1. Take the variation of the Lagrangian: δL
  2. Form the infinitesimal action integral: δS = δL + δW
  3. Apply manifold kinematic substitutions (e.g. δ(ω) for S2)
  4. Simplify
  5. Gather variation vectors and their time derivatives
  6. Integration by parts to move time derivatives off variation vectors
  7. Expand
  8. Extract coefficients of each independent variation vector
Source code in geomech/dynamics/eom.py
def compute_eom(lagrangian, inf_work, variables: SystemVariables):
    """Compute equations of motion using the principle of least action.

    1. Take the variation of the Lagrangian: δL
    2. Form the infinitesimal action integral: δS = δL + δW
    3. Apply manifold kinematic substitutions (e.g. δ(ω) for S2)
    4. Simplify
    5. Gather variation vectors and their time derivatives
    6. Integration by parts to move time derivatives off variation vectors
    7. Expand
    8. Extract coefficients of each independent variation vector
    """
    # variation of the Lagrangian
    dL = lagrangian.delta()

    # infinitesimal action integral
    dS = dL + inf_work

    # apply manifold kinematic substitutions
    dS = apply_manifold_rules(dS, variables)

    dS = full_simplify(dS)

    # gather variation vectors and their time derivatives
    variation_vectors = []
    variation_vector_dots = []

    if variables.scalars:
        raise NotImplementedError(
            "Scalar configuration variables not yet supported in EOM pipeline"
        )

    for vec in variables.vectors:
        x = vec.get_variation_vector()
        variation_vectors.append(x)
        variation_vector_dots.append(x.t_diff())

    for mat in variables.matrices:
        x = mat.get_variation_vector()
        variation_vectors.append(x)
        variation_vector_dots.append(x.t_diff())

    # integration by parts
    dS = integrate_by_parts(dS, variation_vector_dots)

    # expand
    dS = expand(dS)

    # extract equations of motion
    return separate_variations(dS, variation_vectors)

separate_variations(inf_action_integral, variation_vectors)

Extract the equation of motion for each variation vector.

Returns a dict mapping str(variation_vector) → (variation_vector, equation).

Source code in geomech/dynamics/eom.py
def separate_variations(inf_action_integral, variation_vectors):
    """Extract the equation of motion for each variation vector.

    Returns a dict mapping str(variation_vector) → (variation_vector, equation).
    """
    eom = {}
    for vec in variation_vectors:
        dyn_eqn = extract_coeff(inf_action_integral, vec)
        dyn_eqn = full_simplify(dyn_eqn)
        eom[str(vec)] = (vec, dyn_eqn)
    return eom