我有一个程序,该程序应该输出用于围绕任意轴旋转任意角度的旋转矩阵。我从一个空白的3x3 numpy数组开始。我使用嵌套循环遍历数组的每个元素,并根据this awesome method设置值。
从sympy中,我使用KroneckerDelta和LeviCivita,从numpy中,我使用数组。
在我的代码中,我包括了所使用的故障排除方法。该程序在每个步骤中的行为均与我期望的完全一样,只是似乎它只是没有将值添加到组件中。更令人困惑的是,它适用于theta = pi。
有人可以发现我的愚蠢错误吗?
from numpy import array, ndarray, outer, dot, cross, array_equal, identity
from numpy import concatenate, zeros
from numpy import sin, cos, tan, arcsin, arccos, arctan, exp
from numpy.linalg import norm, inv
from numpy import pi, sqrt, arange
from sympy import KroneckerDelta, LeviCivita
def RotationMatrix(axis, angle):
axis = axis / norm( axis )
R = array([[0,0,0],[0,0,0],[0,0,0]])
for i in range(0,3):
for j in range(0,3):
R[i,j] += int(cos(angle)) * int(KroneckerDelta(i,j))
R[i,j] += (1-cos(angle)) * axis[i] * axis[j]
for k in range(0,3):
#R[i,j] -= sin(angle) * axis[k] * LeviCivita(i,j,k)
print(KroneckerDelta(i,j),LeviCivita(i,j,k),i,j,axis[i],axis[j],cos(angle),sin(angle))
print(R)
return R
答案 0 :(得分:0)
不确定哪个编辑有所作为,但是我做了以下事情:
-使用numpy.zeros代替手工制作零数组
-使用虚拟变量“ Temp”临时保存要 添加到旋转矩阵
这是最终代码:
#-v- You input an axis of rotation and an angle of rotation
# this outputs the corresponding rotation matrix
def RotationMatrix(axis, angle):
Temp = 0
axis = Normalized( axis )
R = zeros((3,3))#array([[0,0,0],[0,0,0],[0,0,0]])
for i in range(0,3):
for j in range(0,3):
Temp += cos(angle) * KroneckerDelta(i,j)
Temp += (1-cos(angle)) * axis[i] * axis[j]
R[i,j] = R[i,j] + Temp
Temp = 0
for k in range(0,3):
Temp -= sin(angle) * axis[k] * LeviCivita(i,j,k)
R[i,j] = R[i,j] + Temp
Temp = 0
return R
#-^-