使用subs method:
import sympy as sy
x = sy.Symbol('x')
a = sy.Matrix([[2*x**2,3+x],[4*x**3,-5*x]])
print(a.subs(dict(x=1)))
# [2, 4]
# [4, -5]
或evalf method:
print(a.evalf(subs=dict(x=1)))
# [2.0, 4.0]
# [4.0, -5.0]
如果您有多个符号要替换,只需将它们添加到替换字典中即可。例如,
a.subs(dict(x=1, y=exp(5)))
注意,如果你定义了
x = sy.Symbol('x')
那么您将 绑定 名称 x 到对象 sy.Symbol('x')。如果以后你分配
x = 1
那么您将重新绑定名称 x 到另一个对象 int 1. 旧的 Symbol 对象仍然存在,只是名称 x 不再引用它. (在 Python 中,名称(也就是变量)只是映射到对象)。
同时,如果您将a 绑定到Matrix:
a = sy.Matrix([[2*x**2,3+x],[4*x**3,-5*x]])
Matrix 对象可以使用Symbol,其repr 是x。请注意,这个x 不是 Python 变量,而是Symbol 对象本身。
因此将x 重新分配为1 对a 没有影响。因此
eval('a') 不会用新绑定替换 x。而eval('a') 只是在全局命名空间中查找裸名a,发现它映射到Matrix 对象并返回Matrix。
如果您希望矩阵在x 更改时自动更新,一种可能的解决方案是继承Matrix 并定义一个新属性来执行subs 调用。例如,
import sympy as sy
import math
class UpdatingMatrix(sy.Matrix):
def __init__(self, *args):
super(UpdatingMatrix, self).__init__(*args)
self._names = set([symbol.name for expr in self.mat
for symbol in expr.free_symbols])
@property
def val(self):
return self.subs({name:eval(name) for name in self._names})
x = sy.Symbol('x')
y = sy.Symbol('y')
a = UpdatingMatrix([[2*x**2,3+x*y],[4*x**3,-5*x]])
x = 100
y = 1
print(a.val)
产量
[ 20000, 103]
[4000000, -500]
请注意,您必须使用a.val 才能看到更新后的值;在执行x = 1 之类的任务时,我看不到自动更改a 本身的方法。无论如何,这可能是不可取的,因为如果这是可能的,那么a 将无法在您稍后分配x = 2 时再次自我更新(因为a 将不再依赖于x。)上面的解决方案,每次访问a.val 时,都会重新应用替换,因此a.val 将返回a 的值相对于x 和y 的当前值。