在同情中表达符号表达式时覆盖除法运算符

时间:2016-08-04 09:39:24

标签: python sympy symbolic-math

我正在使用Sympy来评估用户提供的符号表达式,但除法运算符的行为与其他任何数学运算符不同。在使用重写运算符的对象上计算表达式时,我得到加法,减法和乘法的预期结果,但不是除法。下面的代码说明了我的问题:

import sympy
import numpy

class NewMath(int):

    def __add__(self, other):
        print "Adding!"
        return

    def __sub__(self, other):
        print "Subtracting!"
        return

    def __mul__(self, other):
        print "Multiplying!"
        return

    def __div__(self, other):
        print "Dividing!"
        return

three = NewMath(3)
four = NewMath(4)

three + four
three - four
three * four
three / four

# Override sympys default math
func_map = {'+':NewMath.__add__,
            '/':NewMath.__div__}

lambda_args = [sympy.Symbol(arg) for arg in ['three', 'four']]

print "Now sympy math:"
lambda_addition = sympy.lambdify(lambda_args, sympy.Symbol('three') + sympy.Symbol('four'), modules=func_map)
lambda_addition(three, four)

lambda_subtraction = sympy.lambdify(lambda_args, sympy.Symbol('three')  - sympy.Symbol('four'), modules=func_map)
lambda_subtraction(three, four)

lambda_multiplucation = sympy.lambdify(lambda_args, sympy.Symbol('three')  * sympy.Symbol('four'), modules=func_map)
lambda_multiplucation(three, four)

lambda_division = sympy.lambdify(lambda_args, sympy.Symbol('three')  / sympy.Symbol('four'), modules=func_map)
lambda_division(three, four)

输出:

Adding!
Subtracting!
Multiplying!
Dividing!
Now sympy math:
Adding!
Subtracting!
Multiplying!
0.75

我已阅读Sympy Docs并看到/运算符是一个常见问题,但文档似乎表明除法将默认为整数除法,我看不到任何表示无法覆盖/。您可以在我的示例中看到我甚至尝试使用modules参数手动用我的自定义运算符替换除法,但无济于事。

我也看到division in sympy is really just a power of -1 and multiplication,这是否意味着我的事业无望?

我正在使用python 2.7和sympy 1.0

1 个答案:

答案 0 :(得分:-1)

你的事业当然不是完全没有希望的。以下是一些可以帮助您入门的选项。

首先,似乎您理解\__div__ \__truediv__\__floordiv__之间的区别,但如果您还没有,here是一些python 2.7文档。

在python 2.7中,覆盖\__div__似乎应该执行您想要的操作,但您发现的sympy文档被a/b评估为a * b^(-1)除外。为了解决这个问题,您还可以覆盖取幂运算符。

我尝试在python3环境中运行您的代码,更改所有打印实例,以便它们有括号并用div替换truediv的所有实例。

这不是一个完整的答案,但我不能发表评论,所以这就是你得到的!