SymPy - 在矩阵中替换sybolic条目

时间:2014-04-22 01:29:27

标签: python-2.7 substitution sympy

我有一个python函数,它生成带有符号条目的sympy.Matrix。它有效地工作如下:

import sympy as sp
M = sp.Matrix([[1,0,2],[0,1,2],[1,2,0]])

def make_symbolic_matrix(M):
    M_sym = sp.zeros(3)
    syms = ['a0:3']
    for i in xrange(3):
        for j in xrange(3):
            if M[i,j] == 1:
                M_sym = syms[i]
            elif M[i,j] == 2:
                M_sym = 1 - syms[i]
    return M_sym

这很好用。我得到一个矩阵,我可以用它来进行我需要的所有符号计算。

我的问题是现在我想在指定的参数值下评估我的矩阵。通常我会使用.subs属性。但是,由于现在在我的矩阵中用作条目的符号最初被定义为函数中的临时元素,我不知道如何调用它们。

似乎应该可以,因为我能够执行符号计算。

我想做的事情看起来像(遵循上面的代码):

M_sym = make_matrix(M)
M_eval = M_sym.subs([(a0,.8),(a1,.3),(a2,.5)])

但我得到的是“名字'a0'未定义”。

如果有人在那里找到解决方案,我会非常高兴!

PS。我不只是全局定义符号,因为在实际问题中,我不知道我不时有多少参数。

3 个答案:

答案 0 :(得分:1)

在一般情况下,我假设您正在寻找符号元素的n-by-m矩阵。

import sympy

def make_symbolic(n, m):
    rows = []
    for i in xrange(n):
        col = []
        for j in xrange(m):
            col.append(sympy.Symbol('a%d%d' % (i,j)))
        rows.append(col)
    return sympy.Matrix(rows)

可以通过以下方式使用:

make_symbolic(3, 4)

给予:

Matrix([
[a00, a01, a02, a03],
[a10, a11, a12, a13],
[a20, a21, a22, a23]])

一旦你有了这个矩阵,就可以用任何所需的值代替。

答案 1 :(得分:1)

鉴于Andrew的答案很有帮助,您似乎对MatrixSymbol感兴趣。

In [1]: from sympy import *

In [2]: X = MatrixSymbol('X', 3, 4)

In [3]: X  # completely symbolic
Out[3]: X

In [4]: Matrix(X)  # Expand to explicit matrix 
Out[4]: 
⎡X₀₀  X₀₁  X₀₂  X₀₃⎤
⎢                  ⎥
⎢X₁₀  X₁₁  X₁₂  X₁₃⎥
⎢                  ⎥
⎣X₂₀  X₂₁  X₂₂  X₂₃⎦

但回答你原来的问题,你可以从你产生的矩阵中得到这些符号吗?

x12 = X[1, 2]

答案 2 :(得分:0)

符号由其名称定义。 Sympy认为两个具有相同名称的符号是相同的。因此,如果您知道所需符号的名称,只需使用symbols再次创建它们即可。

您也可以很好地使用Python的zip函数。