我在 sympy 中有许多符号表达式,我可能会意识到其中一个系数为零。我会认为,也许是因为我习惯了数学,以下是有道理的:
from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
f = x + y
x = 0
f
令人惊讶的是,返回的是x + y
. 除了在每个等式上明确调用“subs”之外,还有什么方法f
可以返回 justy
吗?
我在 sympy 中有许多符号表达式,我可能会意识到其中一个系数为零。我会认为,也许是因为我习惯了数学,以下是有道理的:
from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
f = x + y
x = 0
f
令人惊讶的是,返回的是x + y
. 除了在每个等式上明确调用“subs”之外,还有什么方法f
可以返回 justy
吗?
我认为这subs
是唯一的方法。它看起来像一个同情的表达是自己的东西。它没有引用组成它的部分。那f
只是有表达式x+y
,但不知道它有任何链接返回到 python 对象x
和y
. 考虑下面的代码:
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
,这是完成你想做的事情的唯一方法。
我不认为有办法自动做到这一点(或者至少在不修改 SymPy 的情况下没有)。
SymPy 的常见问题解答中的以下问题解释了原因:
为什么改变一个变量不会改变另一个依赖它的变量?
简短的回答是“因为它不依赖于它”。:-) 即使您正在使用方程式,您仍然在使用 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 对象的变量时打印的字符串是创建它时给它的字符串,这可能会有所帮助。该字符串不必与您分配给它的变量相同:>>> 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
也许这不是您要寻找的(正如其他人已经解释过的那样),但这是我一次替换多个值的解决方案。
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]])
但是不要试图用这个来制作一个模块。它行不通。这仅在表达式、变量和函数被定义在同一个文件中时才有效,因此函数的所有内容都是全局的,并且可以访问它们。