如何分配属性符号SymPy,让他们在同一个域中?(How to assign properties

2019-10-29 16:14发布

我想扩展SymbolsSymPy这样我就可以添加一个布尔属性。 我能够做到这一点的一个符号(见我的问题在这里 ,也是别人的问题在这里 )。 而要做到这一点的代码重复如下:

from sympy.core.symbol import Symbol
class State(Symbol):
    def __init__(self, name, boolean_attr):
        self.boolean_attr = boolean_attr
        super(State, self).__init__(name)

然而,这种解决方案的问题是,当我定义一个多项式,或某种涉及多个表达的State ,这是我扩展的Symbol类,你可以在上面看到,我需要他们都在同一个域时,我评价它:

单独定义的符号不能被数值计算:

x=sympy.symbols('x')
y=sympy.symbols('y')
some_poly = Poly(x+y)
print some_poly.evalf(subs=dict(zip([sympy.symbols('x, y')],[1,4])))
>>> Poly(x + y, x, y, domain='ZZ')

在同一域中定义的符号可以用数字进行计算:

x, y = sympy.symbols('x, y')
some_poly = Poly(x+y)
print some_poly.evalf(subs=dict(zip(sympy.symbols('x,y'),[1,1])))
>>> 2.00000

这里是我的问题 :我如何实现我的这个相同的行为class State ? 理想的情况下,将工作如下:

x=State('x', boolean_attr=True)
y=State('y', boolean_attr=False)
states_poly = Poly(x+y)
print states_poly.evalf(subs=dict(zip(States('x,y'),[1,1])))
>>> 2.00000

但是,这并不工作,因为Sympy解释X和Y在不同的领域之中。 我如何可以:

  • 得到Sympy解释xy在同一领域正在或
  • 扩大State类能在同一个域,例如,定义符号:

    的x,y =状态( '的x,y',boolean_attr = [真,假])

如何让我的多项式定义使用我的扩展类进行数值计算?

Answer 1:

在你的第一个例子中,你把symbols列表中的,所以你没有拉链X与Y的值1,4:

>>> Poly(x+y).evalf(subs=dict(zip(sympy.symbols('x, y'),[1,4])))
5.00000000000000

如果你使用你所定义的同一国家的符号,你会得到期望的结果

>>> x=State('x', boolean_attr=True)
... y=State('y', boolean_attr=False)
... states_poly = Poly(x+y)
... states_poly.evalf(subs=dict(zip((x,y),[1,1])))
2.00000000000000

(对你提出的语法,使用States这是不确定的。即使没有工作,这样一个例行不会把真一个boolean_attr和False为其他,自上属性的符号匹配,取代将失败。)



文章来源: How to assign properties to symbols in SymPy and have them in the same domain?