矩阵中的sympy subs不会改变值

时间:2022-02-05 16:48:16

I have a symbolic matrix that I want to differentiate. I have to substitute numeric values to some of the vars and then to solve with respect to 6 unknowns. My problem is that defining the element of matrix A by lambda and subistituting with subs doesn't change any value in the matrix. When I want retrieve the type of matrix in fact it's shown that it's immutable, which seems quite odd. Here's the code:

我有一个符号矩阵,我想区分。我必须将数值替换为某些变量,然后针对6个未知数进行求解。我的问题是,通过lambda定义矩阵A的元素并使用subs替换不会改变矩阵中的任何值。当我想要检索矩阵的类型实际上它表明它是不可变的,这看起来很奇怪。这是代码:

def optimalF1():
    x,y,z=symbols('x y z', Real=True)
    phi,theta,psi=symbols('phi theta psi')
    b1x,b1y=symbols('b1x b1y')
    b2x,b2y=symbols('b2x b2y')
    b3x,b3y=symbols('b3x b3y')
    b4x,b4y=symbols('b4x b4y')
    b5x,b5y=symbols('b5x b5y')
    b6x,b6y=symbols('b6x b6y')
    bMat=sym.Matrix(([b1x,b2x,b3x,b4x,b5x,b6x],
       [b1y,b2y,b3y,b4y,b5y,b6y],[0,0,0,0,0,0]))
    mov=np.array([[x],[y],[z]])
    Pi=np.repeat(mov,6,axis=1)
    sym.pprint(Pi)
    print 'shape of thing Pi', np.shape(Pi)
    p1x,p1y,p1z=symbols('p1x,p1y,p1z')
    p2x,p2y,p2z=symbols('p2x,p2y,p2z')
    p3x,p3y,p3z=symbols('p3x,p3y,p3z')
    p4x,p4y,p4z=symbols('p4x,p4y,p4z')
    p5x,p5y,p5z=symbols('p5x,p5y,p5z')
    p6x,p6y,p6z=symbols('p6x,p6y,p6z')
    #legs symbolic array
    l1,l2,l3,l4,l5,l6=symbols('l1,l2,l3,l4,l5,l6')
    piMat=Matrix(([p1x,p2x,p3x,p4x,p5x,p6x],[p1y,p2y,p3y,\
          p4y,p5y,p6y],[p1z,p2z,p3z,p4z,p5z,p6z]))
    piMat=piMat.subs('p1z',0)
    piMat=piMat.subs('p2z',0)
    piMat=piMat.subs('p3z',0)
    piMat=piMat.subs('p4z',0)
    piMat=piMat.subs('p5z',0)
    piMat=piMat.subs('p6z',0)
    sym.pprint(piMat)
    legStroke=np.array([[l1],[l2],[l3],[l4],[l5],[l6]])
    '''redefine the Eul matrix    
    copy values of Pi 6 times by using np.repeat 
    '''
    r1=[cos(phi)*cos(theta)*cos(psi)-sin(phi)*sin(psi),\
             -cos(phi)*cos(theta)*sin(psi)-sin(phi)*cos(psi),\
                cos(phi)*sin(theta)]
    r2=[sin(phi)*cos(theta)*cos(psi)+cos(phi)*sin(psi),\
              -sin(phi)*cos(theta)*sin(psi)+cos(phi)*cos(psi),\
                   sin(phi)*sin(theta)]
    r3= [-sin(theta)*cos(psi),sin(theta)*sin(psi),cos(theta)]
    EulMat=Matrix((r1,r2,r3))
    print(EulMat)
    uvw=Pi+EulMat*piMat     
    print 'uvw matrix is:\n', uvw, np.shape(uvw)
#     check thisout -more elegant and compact form
    A=Matrix(6,1,lambda j,i:((uvw[0,j]- \
            bMat[0,j])**2+(uvw[1,j]-bMat[1,j])**2+\
            (uvw[2,j]-bMat[2,j])**2)-legStroke[j]**2)
    print'A matrix  before simplification:\n ', A
    B=simplify(A)
    B=B.subs({'x':1.37,'y':0,'z':0,theta:-1.37,phi:0})
    print'A matrix form after substituting:\n',B

So comparing A and B leads to the same output. I don't understand why!

因此,比较A和B会导致相同的输出。我不明白为什么!

1 个解决方案

#1


0  

When you use subs with variables that have assumptions, you have to use the symbols not strings. Using strings causes a new generic symbol to be created which does not match the symbol having assumptions so the subs fails.

当您使用具有假设的变量的subs时,您必须使用符号而不是字符串。使用字符串会导致创建一个新的通用符号,该符号与具有假设的符号不匹配,因此subs失败。

>>> var('x')
x
>>> var('y',real=True)
y
>>> (x+y).subs('x',1).subs('y',2)
y + 1

Note, too, that to make real symbols you should use real=True not Real=True (lower case r).

还要注意,要制作真正的符号,你应该使用real = True而不是Real = True(小写r)。

#1


0  

When you use subs with variables that have assumptions, you have to use the symbols not strings. Using strings causes a new generic symbol to be created which does not match the symbol having assumptions so the subs fails.

当您使用具有假设的变量的subs时,您必须使用符号而不是字符串。使用字符串会导致创建一个新的通用符号,该符号与具有假设的符号不匹配,因此subs失败。

>>> var('x')
x
>>> var('y',real=True)
y
>>> (x+y).subs('x',1).subs('y',2)
y + 1

Note, too, that to make real symbols you should use real=True not Real=True (lower case r).

还要注意,要制作真正的符号,你应该使用real = True而不是Real = True(小写r)。