Python Sympy:';Mul&x27;对象没有属性';cos';对于分层函数 总结

Python Sympy:';Mul&x27;对象没有属性';cos';对于分层函数 总结,python,jupyter,sympy,Python,Jupyter,Sympy,我有一个Jupyter实验室笔记本,我一直试图用它来发展机械臂的雅可比矩阵,象征性地用Sympy。我有一些表达式,然后在后续表达式中使用,等等。尝试运行lambdified final表达式时,我收到消息“Mul”对象没有属性“cos” 我试过的 以下是其他问题,如 我已确保使用以下方式给sympy打电话: 将sympy作为sp导入 然后用sp前缀调用所有内容: sp.cos() sp.pi 这是我的代码(我为长代码道歉) 符号分析 将sympy作为sp导入 #变数 θ1,θ2,θ3,θ

我有一个Jupyter实验室笔记本,我一直试图用它来发展机械臂的雅可比矩阵,象征性地用Sympy。我有一些表达式,然后在后续表达式中使用,等等。尝试运行lambdified final表达式时,我收到消息“Mul”对象没有属性“cos”

我试过的 以下是其他问题,如

我已确保使用以下方式给sympy打电话:

将sympy作为sp导入
然后用
sp
前缀调用所有内容:

sp.cos()
sp.pi
这是我的代码(我为长代码道歉)

符号分析 将sympy作为sp导入 #变数 θ1,θ2,θ3,θ4,θ5,θ6=sp.symbols(‘θ1θ2θ3θ4θ5θ6’) #常数(待定) a1、a2、a3=sp符号('a1 a2 a3')) d1、d4、d6=sp符号('d1 d4 d6') #常数(预定) d2、d3、d5、a4、a5、a6、alpha2、alpha6=0、0、0、0、0、0、0 字母1,字母3,字母5=(sp.pi/2,)*3 alpha4=-sp.pi/2 #绕x旋转 def rotx(角度): 返回sp.Matrix([[1,0,0,0],[0,sp.cos(角度),-sp.sin(角度),0],[0,sp.sin(角度),sp.cos(角度),0],[0,0,1]) #绕y旋转 def roty(角度): 返回sp.Matrix([[sp.cos(角度),0,sp.sin(角度),0],[0,1,0,0],-sp.sin(角度),0,sp.cos(角度),0],[0,0,0,1]) #绕z旋转 def rotz(角度): 返回sp.Matrix([[sp.cos(角度),-sp.sin(角度),0,0],[sp.sin(角度),sp.cos(角度),0,0],[0,0,1,0],[0,0,0,1]) #x、y或z方向的平移 def变速器(x、y、z): 返回sp.Matrix([[1,0,0,x]、[0,1,0,y]、[0,0,0,z]、[0,0,0,1]] def dh_矩阵(d,θ,a,α): 返回trans(0,0,d)*rotz(θ)*trans(a,0,0)*rotx(α) t_0_1=dh_矩阵(d1,θ1,a1,α1) t_1_2=dh_矩阵(d2,θ2,a2,α2) t_2_3=dh_矩阵(d3,θ3,a3,α3) t_3_4=dh_矩阵(d4,θ4,a4,α4) t_4_5=dh_矩阵(d5,θ5,a5,α5) t_5_6=dh_矩阵(d6,θ6,a6,α6) t_0_6=t_0_1*t_1_2*t_2_3*t_3_4*t_4*t_5*t_6 最后一列=t\u 0\u 6.列(-1) x=最后一列。行(0) y=最后一列。行(1) z=最后一列。第(2)行 #x的偏导数 dxd1=sp.diff(x,θ1) dxd2=sp.diff(x,θ2) dxd3=sp.diff(x,θ3) dxd4=sp.diff(x,θ4) dxd5=sp.diff(x,θ5) dxd6=sp.diff(x,θ6) #y的偏导数 dyd1=sp.diff(y,θ1) dyd2=sp.diff(y,θ2) dyd3=sp.diff(y,θ3) dyd4=sp.diff(y,θ4) dyd5=sp.diff(y,θ5) dyd6=sp.diff(y,θ6) #z的偏导数 dzd1=sp.diff(z,θ1) dzd2=sp.diff(z,θ2) dzd3=sp.diff(z,θ3) dzd4=sp.diff(z,θ4) dzd5=sp.diff(z,θ5) dzd6=sp.diff(z,θ6) 雅可比矩阵([[dxd1,dxd2,dxd3,dxd4,dxd5,dxd6],[dyd1,dyd2,dyd3,dyd4,dyd5,dyd6],[dzd1,dzd2,dzd3,dzd4,dzd5,dzd6]) 雅可比数值=sp.lambdify([θ1,θ2,θ3,θ4,θ5,θ6,a1,a2,a3,d1,d4,d6],雅可比) 雅可比数值(0,sp.pi/2,0,0,0,0,0,0,1,0.3,0.1) 预期产量 包含数值的3x6矩阵

实际产量 以下错误归因于最后一行:

AttributeError:“Mul”对象没有属性“cos”

我想这与我如何将函数和多个表达式扭曲在一起有关,但我不太确定如何找到它的失败之处

回溯 它有点巨大;我用

---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
---->1当前_jacobian=雅可比数值(0,sp.pi/2,0,0,0,0,0,0,0,1,0.3,0.1)#由于x_2和x_3之间的初始偏移,将pi/2添加到θ2
2电流雅可比矩阵
在λλf中生成(θ1、θ2、θ3、θ4、θ5、θ6、a1、a2、a3、d1、d4、d6)
生成的1个定义λf(θ1、θ2、θ3、θ4、θ5、θ6、a1、a2、a3、d1、d4、d6):
---->2返回(数组([[a1*sin(theta1)-a2*sin(theta1)*cos(theta2)+a3*sin(theta1)*sin(theta2)*sin(theta3)-a3*sin(theta1)*cos(theta2)*cos(theta3)+。。。
AttributeError:“Mul”对象没有属性“cos”

我不完全确定原因,但当我在代码
雅可比数值(0,np.pi/2,0,0,0,0,0,0,1,0.3,0.1)的最后一行将
sp.pi
替换为
np.pi
错误消失了。我已经看到了其他几个问题与此类似,但目前没有很好的答案。这可能是
simpy
中的一个错误,或者希望其他人有更好的解释。

在使用
lambdify
创建可执行函数后,您不再处于
s的“符号数学”世界中ympy
,并且必须传入数值,而不是符号值


您可以传递StackOverflow欢迎!您可以添加回溯吗?添加回溯到初始问题,减去我用
切断的表达式的其余部分哇,这非常简单,谢谢!我想知道这是否是因为,一旦
lambdify
-ed,只应提供数值作为表达式
jacobian\u numeric
,而
sp.pi
是符号。带有符号的numpy数组将具有对象数据类型。
np.cos
将计算委托给每个对象的
cos
方法。这为@BenT提供了相同的“what”,但提供了一个非常值得赞赏的“why”。谢谢!