2015-02-23 88 views
0

我有一個我想區分的符號矩陣。我必須用數字值代替一些變量,然後解決6個未知數。我的問題是用lambda定義矩陣A的元素,並用subsubist替換不會改變矩陣中的任何值。當我想要檢索矩陣的類型時,它顯示它是不可變的,這似乎很奇怪。這裏的代碼:矩陣中的sympy 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 

因此,比較A和B導致相同的輸出。我不明白爲什麼!

回答

0

當你使用具有假設的變量的subs時,你必須使用符號而不是字符串。使用字符串會導致創建一個新的通用符號,該符號與具有假設的符號不匹配,因此子失敗。

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

注意,那就是,使真正的符號,你應該使用real=TrueReal=True(小寫R)。

+0

謝謝,在任何情況下,我設法解決仍在使用符號的問題,但將np.array轉換爲Matrix,以便每個var共享相同的類型,例如:bMat = Matrix(([b1x,b2x,b3x, b4x,b5x,b6x],\ [b1y,b2y,b3y,b4y,b5y,b6y],[0,0,0,0,0,0])) Pi = sym.Matrix(([x,x ,x,x,x,x],[y,y,y,y,y,y],\ [z,z,z,z,z,z])) – Ivranovi 2015-02-25 09:03:56