Introdução

Os números complexos e os quaternions são ferramentas bastante convenientes quando se trata de rotações. Suas construções, no entanto, envolvem objetos misteriosos que surgem, aparentemente, do nada. Hoje, vamos mostrar como as rotações funcionam nas Álgebras de Clifford, além de uma implementação em Julia, usando o pacote Grassmann.jl.

Álgebras de Clifford

Um espaço vetorial tem operações de soma e multiplicação por escalar em sua definição, mas o produto entre vetores não é trivial. Em qualquer curso de álgebra linear é abordado o produto interno , uma forma bilinear, simétrica e positiva que leva dois vetores em um escalar. Também conhecemos da geometrica analítica o produto vetorial , que leva dois vetores em outro vetor, normal ao plano que contém os vetores de entrada e é anti-simétrico. Esse produto, porém, é um caso muito específico do , e por isso vamos adotar o produto externo , também anti-simétrico, porém que leva dois vetores em um bivetor, um segmento orientado de plano que possui a área do paralelogramo definido pelos vetores de entrada.

Produto Geométrico

Além desses produtos, podemos pensar em algo mais geral. Denote o produto entre e como . Podemos decompor esse produto como , isto é, uma parte simétrica e uma anti-simétrica. Ou seja, podemos definir um novo produto, o produto geométrico .

Com isso podemos introduzir a Álgebra de Clifford do .

A álgebra $\mathbb{Cl}_2$

Seja uma base ortonormal b = do . Aplicando o produto geométrico nessa base, podemos gerar o bivetor . Vamos calcular o quadrado desse bivetor:

Como os vetores são ortonormais, podemos inverter a ordem dos vetores, desde que troquemos o sinal. Além disso:

Isto é,

Com isso, temos uma estrutura análoga ao .

Rotações em 2D

Uma rotação em 2D pode ser computada como , onde é um número complexo. Uma rotação de um ângulo é associada ao número complexo . Ou seja, podemos definir a rotação num espaço 2D como: Vamos implementar isso em Julia:

Grassmann.jl

Em Julia, podemos instalar um pacote da seguinte maneira:

Abra o terminal e entre no terminal e digite “Julia”. Em seguida, execute:

using Pkg
Pkg.add("nome do pacote")
ou 
Pkg.add(PackageSpec(path="https://github.com/chakravala/Grassmann.jl.git"))#no caso do Grassmann.jl

O pacote Grassmann.jl implementa, dentre outras coisas, os produtos citados anteriormente. Com isso, podemos implementar a rotação anterior :

using Grassmann

basis"++" #gera os elementos do Cl(2)

function roda(x,theta) #define uma função que rotaciona x por um ângulo theta
    return round(exp(v12*theta/2)*x*exp(-v12*theta/2))
end

vetor = 1*v1#retorna um multivetor    
vetor_rot = roda(vetor,pi/2)
println(vetor)
println(vetor_rot)
println(vetor_rot[1])#podemos acessar os elementos como um array

Generalizando o resultado

Refletindo um vetor duas vezes por dois vetores, estamos também rotacionando este vetor pelo dobro do ângulo entre os vetores usados nas reflexões. Isto é, se queremos rotacionar um vetor pelo ângulo entre os vetores e , fazemos , pegamos o resutado e fazemos . Denotando por e por , o inverso de , temos a seguinte transformação:
Caso e sejam unitários, chamamos de rotor. Basicamente, estamos substituindo o bivetor por um um bivetor unitário quaquer, possibilitando rotacionar qualquer vetor em qualquer plano de rotação no .

using Grassmann

basis"+++" #gera os elementos do Cl(3)

function roda3d(x,B,theta)
    return round(exp(B*theta/2)*x*exp(-B*theta/2))
end

B = v13 #define o plano de rotação
vetor = v1
vetor_rot3d = roda3d(vetor,B,pi/2)
println(vetor)
println(vetor_rot3d)
println(vetor_rot3d[1])

site do buda

Applications of Clifford’s Geometric Algebra

Geometric Algebra

Grassmann.jl