Sympy" global"代换

时间:2012-03-05 00:45:36

标签: python symbolic-math sympy

我在同情中有许多符号表达式,我可能会发现其中一个系数为零。我想,也许是因为我习惯了mathematica,以下是有道理的:

from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
f = x + y
x = 0
f

令人惊讶的是,返回的是x + y。除了在每个等式上明确调用“subs”之外,还有什么办法让f只返回y

3 个答案:

答案 0 :(得分:8)

我认为subs是唯一的方法。它似乎是一种表达自己的表达方式。它没有引用构成它的部分。那是f只有表达式x+y,但不知道它有任何回到python对象xy的链接。请考虑以下代码:

from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')

f1 = x + y
f2 = z + f1
f1 = f1.subs(x,0)
print(f1)
print(f2)

此输出是

y
x + y + z

即使f1已更改,f2也没有。据我所知subs是完成你想要的唯一方法。

答案 1 :(得分:7)

我认为没有办法自动执行此操作(或者至少在没有修改SymPy的情况下执行此操作)。

SymPy's FAQ中的以下问题解释了原因:

  

为什么不更改一个变量会改变另一个变量?

     

简短的回答是“因为依赖它。” :-) 即使   你正在使用方程,你仍在使用Python   对象。您键入的公式使用的是存在的值   创建时间“填充”值,就像常规python一样   定义。之后所做的更改不会改变它们。考虑   以下内容:

>>> a = Symbol('a') # create an object with name 'a' for variable a to point to
>>> b = a + 1; b    # create another object that refers to what 'a' refers to
a + 1
>>> a = 4; a        # a now points to the literal integer 4, not Symbol('a')
4
>>> b               # but b is still pointing at Symbol('a')
a + 1
     

更改数量a不会更改b;你没有使用一套   联立方程组。记住这个可能会有所帮助   打印引用sympy的变量时打印的字符串   object是创建它时给它的字符串;那   string不必与您为其分配的变量相同   到:

>>> r, t, d = symbols('rate time short_life')
>>> d = r*t; d
rate*time
>>> r=80; t=2; d    # we haven't changed d, only r and t
rate*time
>>> d=r*t; d        # now d is using the current values of r and t
160

答案 2 :(得分:2)

也许这不是你正在寻找的(正如其他人已经解释过的那样),但这是我一次替换多个值的解决方案。

def GlobalSubs(exprNames, varNames, values=[]):

    if ( len(values) == 0 ):                # Get the values from the
        for varName in varNames:            # variables when not defined
            values.append( eval(varName) )  # as argument.
        # End for.
    # End if.

    for exprName in exprNames:                        # Create a temp copy
        expr = eval(exprName)                         # of each expression
        for i in range(len(varNames)):                # and substitute
            expr = expr.subs(varNames[i], values[i])  # each variable.
        # End for.
        yield expr     # Return each expression.
    # End for.

它甚至适用于矩阵!

>>> x, y, h, k = symbols('x, y, h, k')
>>> A = Matrix([[ x, -h],
...             [ h,  x]])
>>> B = Matrix([[ y,  k],
...             [-k,  y]])
>>> x = 2; y = 4; h = 1; k = 3
>>> A, B = GlobalSubs(['A', 'B'], ['x', 'h', 'y', 'k'])
>>> A
Matrix([
[2, -1],
[1,  2]])
>>> B
Matrix([
[ 4, 3],
[-3, 4]])

但是不要试图用这个来制作一个模块。它不会起作用。这只有在表达式,变量和函数被定义到同一个文件中时才有效,因此函数的所有内容都是全局的,并且可以访问它们。