Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修改sympify以不简化乘法_Python_Python 3.x_Sympy_Symbolic Math - Fatal编程技术网

Python 修改sympify以不简化乘法

Python 修改sympify以不简化乘法,python,python-3.x,sympy,symbolic-math,Python,Python 3.x,Sympy,Symbolic Math,我正在做一个项目,作为项目的一部分,我需要看看表达式expr,是否是最简单的形式。为此,我使用了SymPy,特别是Sympify函数。我正在表演: sympify(expr)==sympify(expr,evaluate=False) 这确实很好,但有一种简化我不希望它执行。它将产品简化为电源:x*x简化为x^2。有没有办法指定我不希望发生这种简化?类似地,simpify将x+x转换为2*x 有人知道如何修改sympify来处理这个问题吗?谢谢大家! 编辑:解决了!最后我写了一个新的equals

我正在做一个项目,作为项目的一部分,我需要看看表达式
expr
,是否是最简单的形式。为此,我使用了SymPy,特别是Sympify函数。我正在表演:

sympify(expr)==sympify(expr,evaluate=False)

这确实很好,但有一种简化我不希望它执行。它将产品简化为电源:x*x简化为x^2。有没有办法指定我不希望发生这种简化?类似地,simpify将x+x转换为2*x

有人知道如何修改sympify来处理这个问题吗?谢谢大家!

编辑:解决了!最后我写了一个新的equals方法来解决我遇到的问题。新方法在排列和其他我想解释的操作之后测试相等性。如果有人感兴趣,以下是对我有效的解决方案:

def checkEqualPermutations(args1,args2,opType,permute):


    argsNew1 = []
    argsNew2 = []

    for item in args1:
        expanded = expand(item)
        if expanded[0] == opType:
            for arg in expanded[1]:
                argsNew1.append(arg)
        else:
            argsNew1.append(item)

    for item in args2:
        expanded = expand(item)
        if expanded[0] == opType:
            for arg in expanded[1]:
                argsNew2.append(arg)
        else:
            argsNew2.append(item)

    if len(argsNew1) != len(argsNew2):
        return False
    
    if len(argsNew1) == 1:
        return sympyEquals(argsNew1[0],argsNew2[0],permute)

    for i in range(len(argsNew1)):
        if sympyEquals(argsNew1[0],argsNew2[i],permute):
            if checkEqualPermutations(argsNew1[1:],argsNew2[:i]+argsNew2[i+1:],opType,permute):
                return True

    return False

def equals(args1,args2,op,permute):
    if op == "Add" or op == "Mul":
        argsNew1 = []
        argsNew2 = []

        for item in args1:
            expanded = expand(item)
            if expanded[0] == op:
                for arg in expanded[1]:
                    argsNew1.append(arg)
            else:
                argsNew1.append(item)

        for item in args2:
            expanded = expand(item)
            if expanded[0] == op:
                for arg in expanded[1]:
                    argsNew2.append(arg)
            else:
                argsNew2.append(item)

        if len(argsNew1)==len(argsNew2):
            for i in range(len(argsNew1)):
                if not sympyEquals(argsNew1[i],argsNew2[i],permute):
                    return False
        else:
            return False

    else:
        if len(args1)==len(args2):
            for i in range(len(args1)):
                if not sympyEquals(args1[i],args2[i],permute):
                    return False
        else:
            return False
    return True


def expand(exp):
    if type(exp)==Mul:
        for i in range(len(exp.args)):
            if exp.args[i] == 2:
                newArg = Mul(*(exp.args[:i]+exp.args[i+1:]))
                return ("Add",[newArg,newArg])
            if exp.args[i] == 3:
                newArg = Mul(*(exp.args[:i]+exp.args[i+1:]))
                return ("Add",[newArg,newArg,newArg])

        return ("Mul",exp.args)

    if type(exp)==Pow:
        if exp.args[1].is_integer:
            if exp.args[1]>0:
                return ("Mul",[exp.args[0] for i in range(exp.args[1])])

            else:
                if type(exp.args[0])==Mul:

                    for j in range(len(exp.args[0].args)):
                        if exp.args[0].args[j] == 2:

                            powArgs = exp.args[0].args[:j]+exp.args[0].args[j+1:]

                            return ("Pow",[Add(UnevaluatedExpr(powArgs),UnevaluatedExpr(powArgs)),exp.args[1]])

                    newArgs = []
                    for item in exp.args[0].args:
                        newArgs.append(pow(item,exp.args[1]))
                    return ("Mul",newArgs)

    if type(exp) == Add:
        return ("Add",exp.args)

    if type(exp) == Pow:
        return ("Pow",exp.args)

    if type(exp) == cos:
        return ("Cos",exp.args)

    if type(exp) == sin:
        return ("Sin",exp.args)

    return ("Other",exp.args)



def sympyEquals(exp1, exp2, permute):
    if exp1 == exp2:
        return True

    type1,args1 = expand(exp1)
    type2,args2 = expand(exp2)

    if len(args1)!=0 and len(args2)!=0:
        if type1 == type2:
            if permute and (type1=="Add" or type1=="Mul") and (type2=="Add" or type2=="Mul"):
                if checkEqualPermutations(args1,args2,type1,permute):
                    return True
            else:
                if equals(args1,args2,type1,permute):
                    return True

            

    return False

您好,您能提供一个您的输入、输出和所需输出的工作示例吗?事实上,我最终解决了它。谢谢你的帮助@Robb1Hi,你能提供一个你的输入,你得到的输出和期望的输出的工作示例吗?事实上,我最终解决了它。谢谢你的帮助@Robb1