将因子置于同理根下

2024-09-30 01:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在sympy中有这样一个表达式(例如):eq = 1.234113*sqrt(2.33*x0**2+1.332*x1)。我怎样才能强迫那个前置因子在激进分子之下呢?到目前为止,我在网上找到的文档只是用于分解的,但我并没有真正找到这方面的内容。谢谢大家!


Tags: 文档内容表达式sqrt因子eqx1sympy
1条回答
网友
1楼 · 发布于 2024-09-30 01:19:54

SymPy拉出浮点数,使这些表达式成为规范表达式。你可以把它放回去

>>> 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))

但是,它会产生未评估的Expr,我不知道会产生多少麻烦……但它可能会给出一些想法

相关问题 更多 >

    热门问题