Python 这是什么错误:';矩阵&x27;对象没有属性';差异';

Python 这是什么错误:';矩阵&x27;对象没有属性';差异';,python,sympy,differentiation,Python,Sympy,Differentiation,当我试图运行这个程序时,它给出了属性错误。 我是python新手,如果我错过了什么,请原谅。谢谢 import math import numpy as np from sympy import * from sympy import diff import sympy as sp p=np.matrix([[0],[0],[0],[1]]) pdash=p zi=Matrix(2, 1, lambda i,j: Symbol('z%d' % (i+1))) xi=Matrix(2, 1, l

当我试图运行这个程序时,它给出了属性错误。 我是python新手,如果我错过了什么,请原谅。谢谢

import math
import numpy as np
from sympy import *
from sympy import diff
import sympy as sp

p=np.matrix([[0],[0],[0],[1]])
pdash=p
zi=Matrix(2, 1, lambda i,j: Symbol('z%d' % (i+1)))
xi=Matrix(2, 1, lambda i,j: Symbol('x%d' % (i+1)))
alphai=Matrix(2,1, lambda i,j: Symbol('a%d' % (i+1)))
thetai=Matrix(2,1, lambda i,j: Symbol('t%d' % (i+1)))
transformed=np.matrix([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]) 
def transformation_fn(zi,xi,thetai,alphai):
    ca=cos((alphai))
    sa=sin((alphai))
    ct=cos((thetai))
    st=sin((thetai))
    transformation=np.matrix([[ct,-st*ca,st*sa,xi*ct],
                               [st,ct*ca,-ct*sa,xi*st],
                               [0,sa,ca,zi],
                               [0,0,0,1]])
    return transformation

for z,x,t,a in zip(zi,xi,thetai,alphai):
    transformed=transformed*transformation_fn(z,x,t,a)
e=transformed*p
jacobian=e.diff(t1)
print jacobian
我还尝试了一个示例代码,看看diff()在本例中是否有效 输入数学 将numpy作为np导入 从sympy进口* 来自sympy import diff 将sympy作为sp导入

x, y, e1 = symbols('x y e1')
e=Matrix(2,1,lambda i,j:Symbol('e%d'%(i+1)))
I=np.matrix([[1 ,0 ],
             [0 ,1 ]])
k=I*e
print k.diff(e1)

正如评论中所说,符号微分不能应用于Symphy矩阵对象。将其分别应用于每个条目。例如:

t1 = Symbol('t1')
jacobian = Matrix(*e.shape, lambda i,j: e[i,j].diff(t1))
第二行构造了一个与
e
形状相同的矩阵,其中的条目是
e
的条目相对于
t1
的导数


(您从未在代码中实际定义过
t1
,这使得这里的第一行是必需的。)

它只是意味着对于
矩阵
对象,没有名为
diff()
的成员方法。很明显,你不能做
matrix\u object.diff()
对不起,你想要
jacobian=np.diff(e,t1)
@SilentMonk谢谢。但是有没有什么方法可以让我进行区分呢。添加diff()可以很好地使用随机代码来检查它是否有效。@yoyo,请阅读EdChum共享的链接
numpy
对象有一个方法
diff()
。看起来sympy的diff不是矢量化的,即不会对整个数组进行操作,因此您必须迭代
e
并将
diff
的结果分配给每一行。您也可以使用
e.applyfunc(lambda i:diff(i,t1))