Пример #1
0
def differential(P, Q):
    """Polynomial differential operator

Parameters
----------
P : Poly
    Polynomial to be differentiated.
Q : Poly
    Polynomial to differentiate by. Must be decomposed. If
    polynomial array, the output is the Jacobian matrix.
    """
    P, Q = Poly(P), Poly(Q)

    if not is_decomposed(Q):
        differential(decompose(Q)).sum(0)

    if Q.shape:
        return Poly([differential(P, q) for q in Q])

    if Q.dim > P.dim:
        P = setdim(P, Q.dim)
    else:
        Q = setdim(Q, P.dim)

    qkey = Q.keys[0]

    A = {}
    for key in P.keys:

        newkey = np.array(key) - np.array(qkey)

        if np.any(newkey < 0):
            continue

        A[tuple(newkey)] = P.A[key]*np.prod([fac(key[i], \
            exact=True)/fac(newkey[i], exact=True) \
            for i in xrange(P.dim)])

    return Poly(A, P.dim, None)
Пример #2
0
def differential(P, Q):
    """Polynomial differential operator

Parameters
----------
P : Poly
    Polynomial to be differentiated.
Q : Poly
    Polynomial to differentiate by. Must be decomposed. If
    polynomial array, the output is the Jacobian matrix.
    """
    P, Q = Poly(P), Poly(Q)

    if not is_decomposed(Q):
        differential(decompose(Q)).sum(0)

    if Q.shape:
        return Poly([differential(P, q) for q in Q])

    if Q.dim > P.dim:
        P = setdim(P, Q.dim)
    else:
        Q = setdim(Q, P.dim)

    qkey = Q.keys[0]

    A = {}
    for key in P.keys:

        newkey = np.array(key) - np.array(qkey)

        if np.any(newkey < 0):
            continue

        A[tuple(newkey)] = P.A[key] * np.prod(
            [fac(key[i], exact=True) / fac(newkey[i], exact=True) for i in xrange(P.dim)]
        )

    return Poly(A, P.dim, None)
Пример #3
0
def swapdim(P, dim1=1, dim2=0):
    """
Swap the dim between two variables.

Parameters
----------
P : Poly
    Input polynomial.
dim1 : int
    First dim
dim2 : int
    Second dim.

Returns
-------
Q : Poly
    Polynomial with swapped dimensions.

Examples
--------
>>> x,y = variable(2)
>>> P = x**4-y
>>> print P
q0^4-q1
>>> print swapdim(P)
q1^4-q0
    """

    if not isinstance(P, Poly):
        return np.swapaxes(P, dim1, dim2)

    if dim1 == dim2:
        return P

    m = max(dim1, dim2)
    if P.dim <= m:
        P = setdim(P, m + 1)

    A = {}

    for key in P.keys:

        val = P.A[key]
        key = list(key)
        key[dim1], key[dim2] = key[dim2], key[dim1]
        A[tuple(key)] = val

    return Poly(A)
Пример #4
0
def swapdim(P, dim1=1, dim2=0):
    """
Swap the dim between two variables.

Parameters
----------
P : Poly
    Input polynomial.
dim1 : int
    First dim
dim2 : int
    Second dim.

Returns
-------
Q : Poly
    Polynomial with swapped dimensions.

Examples
--------
>>> x,y = variable(2)
>>> P = x**4-y
>>> print P
q0^4-q1
>>> print swapdim(P)
q1^4-q0
    """

    if not isinstance(P, Poly):
        return np.swapaxes(P, dim1, dim2)

    if dim1 == dim2:
        return P

    m = max(dim1, dim2)
    if P.dim <= m:
        P = setdim(P, m + 1)

    A = {}

    for key in P.keys:

        val = P.A[key]
        key = list(key)
        key[dim1], key[dim2] = key[dim2], key[dim1]
        A[tuple(key)] = val

    return Poly(A)