Приведите фактор под радикалом в симпати - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть такое выражение в sympy (например): eq = 1.234113*sqrt(2.33*x0**2+1.332*x1). Как я могу заставить этот префактор go под радикалом? Документация, которую я нашел в Интернете до сих пор, только для факторизации, но я не нашел что-то для этого. Спасибо!

1 Ответ

0 голосов
/ 18 апреля 2020

SymPy вытаскивает Floats, чтобы сделать такие выражения каноническими. Вы можете вернуть его с помощью

>>> a, b = eq.args
>>> sqrt(a**2*b.args[0], evaluate=0)
sqrt(1.88379173728726*x0**2 + 1.07691441805435*x1)

Вы можете создать функцию, которая канонически ставит любое буквальное число под радикал с помощью

def unfactor_radicals(eq):
    """put leading numbers in Mul under a radical, if possible

    Examples
    ========

    >>> from sympy import sqrt, root
    >>> from sympy.abc import x
    >>> eq = -7.2*root(x, 3)**4 + 3*x*sqrt(1/x)
    >>> unfactor_radicals(eq)
    -(4.39540980178165*x)**(4/3) + x*sqrt(9/x)
    """
    from sympy import Pow, UnevaluatedExpr
    def do(m):
        args = m.args
        c = args[0]
        m = args[1:]
        if c < 0:
            s = -1
            c = -c
        else:
            s = 1
        rad = next(ordered([i for i in m if i.is_Pow and i.exp.is_Rational and i.exp.is_Integer is False]))
        i = m.index(rad)
        p = Pow(c**(1/rad.exp)*rad.base, rad.exp, evaluate=False)
        return s*UnevaluatedExpr(m.func(*(m[:i]+(p,)+m[i+1:]), evaluate=False))
    return eq.replace(
        lambda x: x.is_Mul and x.args[0].is_Number and any(
            i.is_Pow and i.exp.is_Rational and i.exp.is_Integer is False
            for i in x.args),
        lambda x: do(x))

Однако она создает UnevaluatedExpr, а я этого не делаю знаю, сколько неприятностей это создаст ... но может дать некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...