【问题标题】:How use command eval with matrix如何将命令 eval 与矩阵一起使用
【发布时间】:2014-05-27 16:48:07
【问题描述】:

我有任何符号:

In [1]: from sympy import *

In [2]: import numpy as np

In [3]: x=Symbol('x')

我创建了任何矩阵:

In [4]: a=Matrix([[2*x**2,3+x],[4*x**3,-5*x]])

In [5]: a
Out[5]:
  Matrix([
          [2*x**2, x + 3],
          [4*x**3,  -5*x]])

如果x=1 我想评估矩阵a。我使用命令eval:

In [6]: x=1

In [7]: eval('a')

Out[7]:
  Matrix([
          [2*x**2, x + 3],
          [4*x**3,  -5*x]]) 

我想得到这个输出:

Out[7]:
  Matrix([
          [2, 4],
          [4, -5]]) 

我在做什么有什么问题?

【问题讨论】:

标签: python matrix


【解决方案1】:

使用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 的当前值。

【讨论】:

  • 感谢您的回答。但我还有其他问题:
  • 感谢您的回答。但我还有其他问题:如果您有两个或多个变量定义为符号并分配一个值,会发生什么情况。例如 y = sy.Symbol('y') an y=exp(5) 并且你有 a = sy.Matrix([[2*x2,3+x*y],[4*x3+y,-5*x]])。如何获得新结果。
  • 您可以为dict添加更多替换:a.subs(dict(x=1, y=exp(5)))。
  • 如果你之前定义了变量 x=1 和 y=exp(5) 你可以写 a.subs(dict(x,y))
  • 不,这不是真的。 dict(x, y) 将引发 TypeError: dict expected at most 1 arguments, got 2。如果x = 1 已经分配,​​那么您可以使用a.subs({'x':x}),但是。 dict键是Symbol的字符串repr,dict值是要替换的新值。
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多