Проблема с изменением индексов массива с симпой и ноль - PullRequest
1 голос
/ 19 апреля 2019

У меня есть программа, которая должна выводить матрицу вращения для поворота на произвольный угол вокруг произвольной оси.Я начинаю с пустого массива 3х3.Я просматриваю каждый элемент массива, используя вложенные циклы, и устанавливаю значение в соответствии с , этот удивительный метод .

Из 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

1 Ответ

0 голосов
/ 22 апреля 2019

Не уверен, какое редактирование имело значение, но я сделал следующее:

-Используйте 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
#-^-  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...