SymPy - substitute sybolic entries in a matrix

前提是你 提交于 2020-01-22 00:43:06

问题


I have a python function which generates a sympy.Matrix with symbolic entries. It works effectively like:

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

This works just fine. I get a matrix out, which I can use for all the symbolical calculations I need.

My issue is that now I want to evaluate my matrix at specified parameter-value. Usually I would just use the .subs attribute. However, since the symbols, that are now used as entries in my matrix, were originally defined as temporary elements in a function, I don't know how to call them.

It seems as if it should be possible, since I'm able to perform symbolic calculations.

What I want to do would look something like (following the code above):

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

But all I get is "name 'a0' is not defined".

I'd be super happy if someone out there got a solution!

PS. I'm not just defining the symbols globally, because in the actual problem I don't know how many parameters I have from time to time.


回答1:


Symbols are defined by their name. Two symbols with the same name will considered to be the same thing by Sympy. So if you know the name of the symbols you want, just create them again using symbols.

You may also find good use of the zip function of Python.




回答2:


In the general case, I assume you're looking for an n-by-m matrix of symbolic elements.

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)

which could be used in the following way:

make_symbolic(3, 4)

to give:

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

once you've got that matrix you can substitute in any values required.




回答3:


Given that the answer from Andrew was helpful it seems like you might be interested in the 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₂₃⎦

But answering your original question, perhapcs you could get the symbols out of the matrix that you produce?

x12 = X[1, 2]


来源:https://stackoverflow.com/questions/23208838/sympy-substitute-sybolic-entries-in-a-matrix

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!