我有一些符号表达式,我可能会意识到其中一个系数是零。我会认为,也许是因为我习惯了mathematica,下面的内容是有意义的:
from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
f = x + y
x = 0
f令人惊讶的是,返回的是x + y。除了在每个等式上显式调用“y”之外,有没有办法让f只返回subs
发布于 2012-03-05 09:45:02
我不认为有一种方法可以自动完成(或者至少不需要修改SymPy)。
以下来自SymPy's FAQ的问题解释了其中的原因:
为什么改变一个变量不改变依赖于它的另一个变量?
简短的答案是“因为它不依赖于它。”:-)即使你在处理方程式,你仍然在处理对象。您键入的公式使用创建时出现的值来“填充”值,就像常规的python定义一样。它们不会被之后所做的更改所改变。考虑following:
a = >>> ( 'a‘)#为变量a创建一个名为'a’的对象以指向符号b=a+ 1;b#创建另一个引用‘a’表示a+1 >>> a=4的对象;a#a现在指向文字整数4,而不是符号(‘a’)4 >>> b#但b仍然指向符号(‘a’)a+1
更改量a不会更改b;您使用的不是一组联立方程。请记住,当您打印引用渐近对象的变量时打印的字符串是创建该对象时提供给它的字符串;该字符串不必与您为其赋值的变量相同:
r,t,d= 160 (‘rate time short_life') >>> d=r*t;d rate*time >>> r=80;t=2;d#我们没有更改d,只有r和t rate*time >>> d=r*t;d#现在d使用r和t的当前值
发布于 2012-03-05 09:43:46
我认为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是完成你想做的事情的唯一方法。
发布于 2014-11-09 07:26:13
也许这不是您想要的(因为其他人已经解释过了),但这是我一次替换多个值的解决方案。
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]])但是不要试图用这个来做一个模块。恐怕行不通。只有当表达式、变量和函数被定义到同一个文件中时,这才会起作用,因此函数的所有内容都是全局的,并且它可以访问它们。
https://stackoverflow.com/questions/9560362
复制相似问题