
    Edl                     n    d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd
ZdS )zX
This module implements a method to find
Euler-Lagrange Equations for given Lagrangian.
    )combinations_with_replacement)
DerivativeFunctiondiff)Eq)S)Symbolsympify)iterable c                    t                    rt                    nfs(t          |                     t                              n,D ])}t	          |t                    st          d|z            *t          |          rt          |          n|f}|sd         j        }nt          d |D                       }t          d |D                       st          d|z            D ]"}||j        k    st          d|d|          #t          fd|                     t                    D             dgz             }g }D ]}t          | |          }t          d	|d	z             D ]A}t          ||          D ].}|t          j        |z  t          | t          |g|R  g|R  z  z   }/Bt!          |d          }	t	          |	t                     r|                    |	           |S )
a5  
    Find the Euler-Lagrange equations [1]_ for a given Lagrangian.

    Parameters
    ==========

    L : Expr
        The Lagrangian that should be a function of the functions listed
        in the second argument and their derivatives.

        For example, in the case of two functions $f(x,y)$, $g(x,y)$ and
        two independent variables $x$, $y$ the Lagrangian has the form:

            .. math:: L\left(f(x,y),g(x,y),\frac{\partial f(x,y)}{\partial x},
                      \frac{\partial f(x,y)}{\partial y},
                      \frac{\partial g(x,y)}{\partial x},
                      \frac{\partial g(x,y)}{\partial y},x,y\right)

        In many cases it is not necessary to provide anything, except the
        Lagrangian, it will be auto-detected (and an error raised if this
        cannot be done).

    funcs : Function or an iterable of Functions
        The functions that the Lagrangian depends on. The Euler equations
        are differential equations for each of these functions.

    vars : Symbol or an iterable of Symbols
        The Symbols that are the independent variables of the functions.

    Returns
    =======

    eqns : list of Eq
        The list of differential equations, one for each function.

    Examples
    ========

    >>> from sympy import euler_equations, Symbol, Function
    >>> x = Function('x')
    >>> t = Symbol('t')
    >>> L = (x(t).diff(t))**2/2 - x(t)**2/2
    >>> euler_equations(L, x(t), t)
    [Eq(-x(t) - Derivative(x(t), (t, 2)), 0)]
    >>> u = Function('u')
    >>> x = Symbol('x')
    >>> L = (u(t, x).diff(t))**2/2 - (u(t, x).diff(x))**2/2
    >>> euler_equations(L, u(t, x), [t, x])
    [Eq(-Derivative(u(t, x), (t, 2)) + Derivative(u(t, x), (x, 2)), 0)]

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Euler%E2%80%93Lagrange_equation

    zFunction expected, got: %sr   c              3   4   K   | ]}t          |          V  d S Nr
   ).0vars     4lib/python3.11/site-packages/sympy/calculus/euler.py	<genexpr>z"euler_equations.<locals>.<genexpr>V   s(      22cWS\\222222    c              3   @   K   | ]}t          |t                    V  d S r   )
isinstancer	   )r   vs     r   r   z"euler_equations.<locals>.<genexpr>X   s,      33z!V$$333333r   z!Variables are not symbols, got %sz
Variables z do not match args: c                 J    g | ]}|j         v t          |j                   S r   )exprlen	variables)r   dfuncss     r   
<listcomp>z#euler_equations.<locals>.<listcomp>_   s=     , , ,a6U?,Q[!! , , ,r      )r   tupleatomsr   r   	TypeErrorargsall
ValueErrormaxr   r   ranger   r   NegativeOner   append)
Lr   varsfordereqnseqipnew_eqs
    `        r   euler_equationsr4      sd   t %UOO9E%LLL%E Baggh''(( 	B 	BAa** B <q @AAAB #4..55;;;tgD 3Qx}22T2222233d33333 D;dBCCC O Oqv~ 	O*TTT11MNNN	O  , , , ,177:+>+> , , ,/0c2 3 3E D    !QZZq%!)$$ 	D 	DA24;; D D!-*44;A;;;+C+C+C+CCCDBfb!! 	 KKKr   N)r   r   )__doc__	itertoolsr   sympy.core.functionr   r   r   sympy.core.relationalr   sympy.core.singletonr   sympy.core.symbolr	   sympy.core.sympifyr   sympy.utilities.iterablesr   r4   r   r   r   <module>r=      s     4 3 3 3 3 3 < < < < < < < < < < $ $ $ $ $ $ " " " " " " $ $ $ $ $ $ & & & & & & . . . . . .^ ^ ^ ^ ^ ^r   