#!/usr/bin/env python
# coding: utf-8
# # A Geometria das Transformações Lineares
# #### Dependendo de como encaramos uma n-upla, se como um ponto ou um vetor, o efeito geométrico de um operador $T: R^{n}$ → $R^{n}$ é o de transformar cada ponto (ou vetor) de $R^{n}$ em algum novo ponto (ou vetor).
# ##### ****Referência: Álgebra Linear com aplicações / Anton Howard e Chris Rorres; trad. Claus Ivo Doering. - 8. ed. - Porto Alegre: Bookman, 2001.****
# ### Reflexões
# Considere o operador $T: R^{n}$ → $R^{n}$ que aplica cada vetor na sua imagem simétrica em relação a diferentes eixos. Para conseguir fazer esse processo, vamos utilizar a ideia de **Transformação Linear** para mudar o vetor de uma base para outra, utilizando nossas matrizes de transformações lineares definidas abaixo.
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Reflexão em torno do eixo y |
# $$w_{1} = -x$$ $$w_{2} = y$$ |
# $\begin{bmatrix}
# -1 & 0 \\
# 0 & 1 \\
# \end{bmatrix}$ |
#
# Reflexão em torno do eixo x |
# $$w_{1} = x$$ $$w_{2} = -y$$ |
# $\begin{bmatrix}
# 1 & 0 \\
# 0 & -1 \\
# \end{bmatrix} $ |
#
# Reflexão em torno da reta y = x |
# $$w_{1} = y$$ $$w_{2} = x$$ |
# $\begin{bmatrix}
# 0 & 1 \\
# 1 & 0 \\
# \end{bmatrix}$ |
#
# Primeiramente, vamos importar as bibliotecas do Python que serão necessárias ao decorrer do progama:
# In[1]:
# importando a biblioteca numpy do Python
import numpy as np
# importando a biblioteca matplotlib do Python
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
# Vamos agora definir uma função que, ao receber um vetor em uma lista e a matriz de transformação adequada, realiza a transformação linear responsável por fazer a reflexão do vetor em questão.
# In[2]:
def transformacaoLinear2d(vetor, matriz):
# definindo as dimensões da figura
plt.figure(figsize = (10,5))
# plotando mais de um gráfico na mesma área de trabalho
# plt.subplot(1 linha, 2 colunas, 1º gráfico)
plt.subplot(1,2,1)
# plota o ponto definido para o vetor, esse que parte da origem
plt.scatter(vetor[0], vetor[1], color = "red", label = "(x,y)")
# definindo uma lista mais precisa no eixo x para plotar o vetor
x = [0, vetor[0]]
# definindo uma lista mais precisa no eixo y para plotar o vetor
y = [0, vetor[1]]
# plotando o vetor informado
plt.plot(x, y, color = "blue", label = "x")
# adicionando uma grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# adicionando a legenda ao gráfico
plt.legend()
# adicionando um título ao gráfico
plt.title("Antes da Transformação")
# realizando a mudança de base para o vetor com a matriz de transformação linear
novoVetor = np.dot(vetor, matriz)
# plotando mais de um gráfico na mesma área de trabalho
# plt.subplot(1 linha, 2 colunas, 2º gráfico)
plt.subplot(1,2,2)
# plota o ponto definido para o vetor, esse que parte da origem
plt.scatter(vetor[0], vetor[1], color = "red", label = "(x,y)")
# plotando o vetor informado
plt.plot(x, y, color = "blue", label = "x")
# definindo uma lista mais precisa no eixo x para plotar o novo vetor
x = [0, novoVetor[0]]
# definindo uma lista mais precisa no eixo y para plotar o novo vetor
y = [0, novoVetor[1]]
# plota o ponto definido para o vetor, esse que parte da origem
plt.scatter(x, y, color = "yellow", label = "(T(x1),T(y1))")
# plotando o vetor obtido
plt.plot(x, y, color = "brown", label = "w = T(x)")
# adicionando uma grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# adicionando a legenda ao gráfico
plt.legend()
# adicionando um título ao gráfico
plt.title("Após a Transformação")
# função não retorna nenhum valor
return None
# Vamos agora definir um vetor qualquer, para testarmos as matrizes de transformação.
# In[3]:
# definindo um vetor qualquer para utilizarmos no nosso exemplo
vetor2d = [3,4]
# Por fim, devemos definir as matrizes também em Python para conseguirmos compilar e visualizar as transformações lineares com auxílio da função acima.
# In[4]:
# definindo a matriz de reflexão em torno do eixo y
matriz1 = np.array([[-1, 0],
[0, 1]])
# definindo a matriz de reflexão em torno do eixo x
matriz2 = np.array([[1, 0],
[0, -1]])
# definindo a matriz de reflexão em torno da reta y = x
matriz3 = np.array([[0, 1],
[1, 0]])
# Agora que definimos todo o nosso ambiente de trabalho para realizar as diferentes reflexões em nosso vetor, podemos visualizar o comportamento gráfico das transformações lineares:
# #### Reflexão em torno do eixo y
# In[5]:
# realizando a transformação linear responsável por fazer uma reflexão em torno do eixo y
transformacaoLinear2d(vetor2d, matriz1)
# In[6]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz1))
# #### Reflexão em torno do eixo x
# In[7]:
# realizando a transformação linear responsável por fazer uma reflexão em torno do eixo x
transformacaoLinear2d(vetor2d, matriz2)
# In[8]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz2))
# #### Reflexão em torno da reta y = x
# In[9]:
# realizando a transformação linear responsável por fazer uma reflexão em torno da reta y = x
transformacaoLinear2d(vetor2d, matriz3)
# In[10]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz3))
# podemos definir as mesmas transformações lineares usando 3 dimensões. Observe as semelhanças com o processo anterior na nova função abaixo.
# In[11]:
def transformacaoLinear3d(vetor, matriz):
# definindo as dimensões da figura
fig = plt.figure(figsize = (20,10))
# definindo o ambiente 3d para a plotagem
ax = plt.axes(projection="3d")
# plotando mais de um gráfico na mesma área de trabalho
# plt.subplot(1 linha, 2 colunas, 1º gráfico)
ax = fig.add_subplot(1, 2, 1, projection='3d')
# plota o ponto definido para o vetor, esse que parte da origem
ax.scatter3D(vetor[0], vetor[1], vetor[2], color = "red", label = "(x,y,z)")
# definindo uma lista mais precisa no eixo x para plotar o vetor
x = [0, vetor[0]]
# definindo uma lista mais precisa no eixo y para plotar o vetor
y = [0, vetor[1]]
# definindo uma lista mais precisa no eixo z para plotar o vetor
z = [0, vetor[2]]
# plotando o vetor informado
ax.plot3D(x, y, z, color = "blue", label = "x")
ax.plot3D([0,1], [0,0], [0,0], color = "green")
ax.plot3D([0,0], [0,1], [0,0], color = "green")
ax.plot3D([0,0], [0,0], [0,1], color = "green")
# adicionando uma grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# adicionando a legenda ao gráfico
plt.legend()
# adicionando um título ao gráfico
plt.title("Antes da Transformação")
# realizando a mudança de base para o vetor com a matriz de transformação linear
novoVetor = np.dot(vetor, matriz)
# plotando mais de um gráfico na mesma área de trabalho
# plt.subplot(1 linha, 2 colunas, 2º gráfico)
ax = fig.add_subplot(1, 2, 2, projection='3d')
# plota o ponto definido para o vetor, esse que parte da origem
ax.scatter3D(vetor[0], vetor[1], vetor[2], color = "red", label = "(x,y,z)")
# plotando o vetor informado
ax.plot3D(x, y, z, color = "blue", label = "x")
# definindo uma lista mais precisa no eixo x para plotar o novo vetor
x = [0, novoVetor[0]]
# definindo uma lista mais precisa no eixo y para plotar o novo vetor
y = [0, novoVetor[1]]
# definindo uma lista mais precisa no eixo z para plotar o novo vetor
y = [0, novoVetor[2]]
# plota o ponto definido para o vetor, esse que parte da origem
ax.scatter3D(x, y, z, color = "yellow", label = "(T(x1),T(y1), T(z1))")
# plotando o vetor obtido
ax.plot3D(x, y, z, color = "brown", label = "w = T(x)")
ax.plot3D([0,1], [0,0], [0,0], color = "green")
ax.plot3D([0,0], [0,1], [0,0], color = "green")
ax.plot3D([0,0], [0,0], [0,1], color = "green")
# adicionando uma grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# adicionando a legenda ao gráfico
plt.legend()
# adicionando um título ao gráfico
plt.title("Após a Transformação")
# função não retorna nenhum valor
# função não retorna nenhum valor
return None
# As matrizes de transformação que serão utilizadas para realizar a reflexão do vetor em 3 dimensões em torno do **plano xy**, **plano xz** e **plano yz**, respectivamente, estão ilustradas abaixo:
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Reflexão em torno do plano xy |
# $$w_{1} = x$$ $$w_{2} = y$$ $$w_{3} = -z$$ |
# $\begin{bmatrix}
# 1 & 0 & 0 \\
# 0 & 1 & 0 \\
# 0 & 1 & -1 \\
# \end{bmatrix}$ |
#
# Reflexão em torno do plano xz |
# $$w_{1} = x$$ $$w_{2} = -y$$ $$w_{3} = z$$ |
# $\begin{bmatrix}
# 1 & 0 & 0 \\
# 0 & -1 & 0 \\
# 0 & 1 & 1 \\
# \end{bmatrix}$ |
#
# Reflexão em torno do plano yz |
# $$w_{1} = -x$$ $$w_{2} = y$$ $$w_{3} = z$$ |
# $\begin{bmatrix}
# -1 & 0 & 0 \\
# 0 & 1 & 0 \\
# 0 & 1 & 1 \\
# \end{bmatrix}$ |
#
# Devemos agora definir um vetor em 3 dimensões e tornar as matrizes acima compiláveis pelo Python:
# In[12]:
# definindo um vetor qualquer para utilizarmos no nosso exemplo
vetor3d = [1,2,3]
# In[13]:
# definindo a matriz de reflexão em torno do plano xy
matriz4 = np.array([[1, 0, 0],
[0, 1, 0],
[0, 0, -1]])
# definindo a matriz de reflexão em torno do plano xz
matriz5 = np.array([[1, 0, 0],
[0, -1, 0],
[0, 0, 1]])
# definindo a matriz de reflexão em torno do plano yz
matriz6 = np.array([[-1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
# Agora que definimos todo o ambiente de trabalho para realizar as reflexões no vetor, podemos visualizar o compartamento gráfico das transformações lineares:
# #### Reflexão em torno do plano xy
# In[14]:
# realizando a transformação linear responsável por fazer uma reflexão em torno do plano xy
transformacaoLinear3d(vetor3d, matriz4)
# In[15]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz4))
# #### Reflexão em torno do plano xz
# In[16]:
# realizando a transformação linear responsável por fazer uma reflexão em torno do plano xz
transformacaoLinear3d(vetor3d, matriz5)
# In[17]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz5))
# #### Reflexão em torno do plano yz
# In[18]:
# realizando a transformação linear responsável por fazer uma reflexão em torno do plano yz
transformacaoLinear3d(vetor3d, matriz6)
# In[19]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz6))
# ### Projeções
# Considere o operador $T: R^{n}$ → $R^{n}$ que leva cada vetor na sua **projeção ortogonal** sobre os eixos.
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Projeção ortogonal sobre o eixo x |
# $$w_{1} = x$$ $$w_{2} = 0$$ |
# $\begin{bmatrix}
# 1 & 0 \\
# 0 & 0 \\
# \end{bmatrix}$ |
#
# Projeção ortogonal sobre o eixo y |
# $$w_{1} = 0$$ $$w_{2} = y$$ |
# $\begin{bmatrix}
# 0 & 0 \\
# 0 & 1 \\
# \end{bmatrix}$ |
#
# Devemos agora definir as matrizes acima compiláveis pelo Python:
# In[20]:
# definindo a matriz de transformação para a projeção ortogonal sobre o eixo x
matriz7 = np.array([[1, 0],
[0, 0]])
# definindo a matriz de transformação para a projeção ortogonal sobre o eixo y
matriz8 = np.array([[0, 0],
[0, 1]])
# #### Projeção ortogonal no eixo x
# In[21]:
# realizando a transformação linear responsável por fazer uma projeção ortogonal no eixo x
transformacaoLinear2d(vetor2d, matriz7)
# In[22]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz7))
# #### Projeção ortogonal no eixo y
# In[23]:
# realizando a transformação linear responsável por fazer uma projeção ortogonal no eixo y
transformacaoLinear2d(vetor2d, matriz8)
# In[24]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz8))
# As matrizes de transformação que serão utilizadas para realizar a projeção ortogonal do vetor em 3 dimensões em torno do **plano xy**, **plano xz** e **plano yz**, respectivamente, estão ilustrados abaixo:
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Projeção ortogonal sobre o plano xy |
# $$w_{1} = x$$ $$w_{2} = y$$ $$w_{3} = 0$$ |
# $\begin{bmatrix}
# 1 & 0 & 0 \\
# 0 & 1 & 0 \\
# 0 & 0 & 0 \\
# \end{bmatrix}$ |
#
# Projeção ortogonal sobre o plano xz |
# $$w_{1} = x$$ $$w_{2} = 0$$ $$w_{3} = z$$ |
# $\begin{bmatrix}
# 1 & 0 & 0 \\
# 0 & 0 & 0 \\
# 0 & 0 & 1 \\
# \end{bmatrix}$ |
#
# Projeção ortogonal sobre o plano yz |
# $$w_{1} = 0$$ $$w_{2} = y$$ $$w_{3} = z$$ |
# $\begin{bmatrix}
# 0 & 0 & 0 \\
# 0 & 1 & 0 \\
# 0 & 0 & 1 \\
# \end{bmatrix}$ |
#
# Devemos agora definir as matrizes acima compiláveis pelo Python:
# In[25]:
# definindo a matriz de transformação para a projeção ortogonal sobre o plano xy
matriz9 = np.array([[1, 0, 0],
[0, 1, 0],
[0, 0, 0]])
# definindo a matriz de transformação para a projeção ortogonal sobre o plano xz
matriz10 = np.array([[1, 0, 0],
[0, 0, 0],
[0, 0, 1]])
# definindo a matriz de transformação para a projeção ortogonal sobre o plano yz
matriz11 = np.array([[0, 0, 0],
[0, 1, 0],
[0, 0, 1]])
# #### Projeção ortogonal sobre o plano xy
# In[26]:
# realizando a transformação linear responsável por fazer uma projeção ortogonal sobre o plano xy
transformacaoLinear3d(vetor3d, matriz9)
# In[27]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz9))
# #### Projeção ortogonal sobre o plano xz
# In[28]:
# realizando a transformação linear responsável por fazer uma projeção ortogonal sobre o plano xz
transformacaoLinear3d(vetor3d, matriz10)
# In[29]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz10))
# #### Projeção ortogonal sobre o plano yz
# In[30]:
# realizando a transformação linear responsável por fazer uma projeção ortogonal sobre o plano yz
transformacaoLinear3d(vetor3d, matriz11)
# In[31]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz11))
# ### Rotações
# Um operador que gira cada vetor em $R^{n}$ por um ângulo fixado θ é chamado uma rotação em $R^{n}$.
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Rotação pelo ângulo θ |
# $$w_{1} = x.cos(t) + y.sen(t)$$ $$w_{2} = -x.sen(t) + y.cos(t)$$ |
# $\begin{bmatrix}
# cos(t) & sen(t) \\
# -sen(t) & cos(t) \\
# \end{bmatrix}$ |
#
#
# Devemos agora definir um ângulo qualquer (vamos usar 45°) e tornar as matrizes acima compiláveis pelo Python:
# In[32]:
# definindo um ângulo de 45° para utilizarmos no nosso exemplo, em radianos
teta = np.pi / 4
# In[33]:
# definindo a matriz de transformação para a rotação dado um ângulo qualquer
matriz12 = np.array([[np.cos(teta), (np.sin(teta))],
[-np.sin(teta), np.cos(teta)]])
# #### Rotação de um vetor 45º
# In[34]:
# realizando a transformação linear responsável por fazer uma rotação dado um ângulo teta
transformacaoLinear2d(vetor2d, matriz12)
# In[35]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz12))
# Vamos mudar o ângulo θ para 90°:
# In[36]:
# definindo um ângulo de 90º para teta, em radianos
teta = np.pi / 2
# In[37]:
# definindo a matriz de transformação para a rotação dado um ângulo qualquer
matriz12 = np.array([[np.cos(teta), (np.sin(teta))],
[-np.sin(teta), np.cos(teta)]])
# #### Rotação de um vetor 90º
# In[38]:
# realizando a transformação linear responsável por fazer uma rotação dado um ângulo teta
transformacaoLinear2d(vetor2d, matriz12)
# In[39]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz12))
# As matrizes de transformação que serão utilizadas para realizar as rotações do vetor em 3 dimensões estão ilustradas abaixo:
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Rotação anti-horária em torno do eixo x positivo por um ângulo θ |
# $$w_{1} = x$$ $$w_{2} = y.cos(t) - z.sen(t)$$ $$w_{3} = y.sen(t) + z.cos(t)$$ |
# $\begin{bmatrix}
# 1 & 0 & 0 \\
# 0 & cos(t) & -sen(t) \\
# 0 & sen(t) & cos(t) \\
# \end{bmatrix}$ |
#
# Rotação anti-horária em torno do eixo y positivo por um ângulo θ |
# $$w_{1} = x.cos(t) + z.sen(t)$$ $$w_{2} = y$$ $$w_{3} = -x.sen(t) + z.cos(t)$$ |
# $\begin{bmatrix}
# cos(t) & 0 & sen(t) \\
# 0 & 1 & 0 \\
# -sen(t) & 0 & cos(t) \\
# \end{bmatrix}$ |
#
# Rotação anti-horária em torno do eixo z positivo por um ângulo θ |
# $$w_{1} = x.cos(t) - y.sen(t)$$ $$w_{2} = x.sen(t) + y.cos(t)$$ $$w_{3} = z$$ |
# $\begin{bmatrix}
# cos(t) & -sen(t) & 0 \\
# sen(t) & cos(t) & 0 \\
# 0 & 0 & 1 \\
# \end{bmatrix}$ |
#
# Devemos agora definir as matrizes acima compiláveis pelo Python:
# In[40]:
# definindo um ângulo de 30º para utilizarmos no nosso exemplo
teta = np.pi / 6
# In[41]:
# definindo a matriz de transformação para rotação anti-horária em torno do eixo x positivo por um ângulo
# teta
matriz13 = np.array([[1, 0, 0],
[0, np.cos(teta), -np.sin(teta)],
[0, np.sin(teta), np.cos(teta)]])
# definindo a matriz de transformação para rotação anti-horária em torno do eixo y positivo por um ângulo
# teta
matriz14 = np.array([[np.cos(teta), 0, np.sin(teta)],
[0, 1, 0],
[-np.sin(teta), 0, np.cos(teta)]])
# definindo a matriz de transformação para rotação anti-horária em torno do eixo z positivo por um ângulo
# teta
matriz15 = np.array([[np.cos(teta), -np.sin(teta), 0],
[np.sin(teta), np.cos(teta), 0],
[0, 0, 1]])
# #### rotação anti-horária em torno do eixo x positivo por um ângulo 30º
# In[42]:
# realizando a transformação linear responsável por fazer uma rotação anti-horária em
# torno do eixo x positivo por um ângulo θ
transformacaoLinear3d(vetor3d, matriz13)
# In[43]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz13))
# #### rotação anti-horária em torno do eixo y positivo por um ângulo 30°
# In[44]:
# realizando a transformação linear responsável por fazer uma rotação anti-horária em
# torno do eixo y positivo por um ângulo θ
transformacaoLinear3d(vetor3d, matriz14)
# In[45]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz14))
# #### rotação anti-horária em torno do eixo z positivo por um ângulo 30º
# In[46]:
# realizando a transformação linear responsável por fazer uma rotação anti-horária em
# torno do eixo z positivo por um ângulo θ
transformacaoLinear3d(vetor3d, matriz15)
# In[47]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz15))
# ### Dilatações e Contrações
# Se **k** é um escalar não-negativo, então o operador $T(x) = kx$ de $R^{n}$ é chamado uma **homotetia** de razão k; especificamente, o operador é uma **contração de razão k** se 0 ≤ k ≤ 1 e uma **dilatação de razão k** se k ≥ 1. O efeito geométrico de uma contração é comprimir cada vetor por um fator **k** e o efeito geométrico de uma dilatação é esticar cada vetor por um fator **k**. Uma contração comprime $R^{n}$ uniformemente de todas as direções na direção da origem e uma dilatação expande $R^{n}$ uniformemente em todas as direções para longe da origem. A contração mais extrema ocorre quando **k** = 0, caso em que $T(x) = kx$ reduz ao operador nulo $T(x) = 0$, que comprime cada vetor a um único ponto (a origem). Se k = 1, então $T(x) = kx$ reduz ao operador identidade $T(x) = x$, que deixa cada vetor inalterado; isto poderia ser considerado tanto uma contração quanto uma dilatação.
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Contração de fator k em $R^{2}$ (0 ≤ k ≤ 1) |
# $$w_{1} = kx$$ $$w_{2} = ky$$ |
# $\begin{bmatrix}
# k & 0 \\
# 0 & k \\
# \end{bmatrix}$ |
#
# Dilatação de fator k em $R^{2}$ (0 ≥ 1) |
# $$w_{1} = kx$$ $$w_{2} = ky$$ |
#
# Devemos agora defininir um valor para k, e tornar as matrizes acima compiláveis pelo Python:
# In[48]:
# definindo um valor para k de contração
k = 0.75
# In[49]:
# definindo a matriz de transformação para dilatações e contrações de vetores
matriz16 = np.array([[k, 0],
[0, k]])
# #### Contração de um vetor quando k = 0.75
# In[50]:
# realizando a transformação linear responsável por fazer uma contração no vetor
transformacaoLinear2d(vetor2d, matriz16)
# In[51]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz16))
# In[52]:
# definindo um vetor qualquer para utilizarmos no nosso exemplo
vetor = [2,2]
# definindo um valor para k de dilatação
k = 2
# In[53]:
# definindo a matriz de transformação para dilatações e contrações de vetores
matriz16 = np.array([[k, 0],
[0, k]])
# #### Dilatação de um vetor quando k = 2
# In[54]:
# realizando a transformação linear responsável por fazer uma dilatação no vetor
transformacaoLinear2d(vetor2d, matriz16)
# In[55]:
# visualizando o vetor antes da transformação linear
print(vetor2d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor2d, matriz16))
# As matrizes de transformação que serão utilizadas para realizar as contrações e dilatações do nosso vetor em 3 dimensões estão ilustradas abaixo:
#
#
# Operador |
# Equações |
# Matriz Canônica |
#
# Contração de fator k em $R^{3}$ (0 ≤ k ≤ 1) |
# $$w_{1} = kx$$ $$w_{2} = ky$$ $$w_{3} = kz$$ |
# $\begin{bmatrix}
# k & 0 & 0 \\
# 0 & k & 0 \\
# 0 & 0 & k \\
# \end{bmatrix}$ |
#
# Dilatação de fator k em $R^{3}$ (k ≥ 1) |
# $$w_{1} = kx$$ $$w_{2} = ky$$ $$w_{3} = kz$$ |
#
# Devemos agora tornar as matrizes acima compiláveis pelo Python:
# In[56]:
# definindo um valor de contração para k
k = 0.25
# In[57]:
# definindo a matriz de transformação para dilatações e contrações de vetores
matriz17 = np.array([[k, 0, 0],
[0, k, 0],
[0, 0, k]])
# #### Contração de um vetor quando k = 0.25
# In[58]:
# realizando a transformação linear responsável por fazer uma contração no vetor
transformacaoLinear3d(vetor3d, matriz17)
# In[59]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz17))
# In[60]:
# definindo um vetor qualquer para utilizarmos no nosso exemplo
vetor = [2,2,2]
# definindo um valor de dilatação para k
k = 2
# In[61]:
# definindo a matriz de transformação para dilatações e contrações de vetores
matriz17 = np.array([[k, 0, 0],
[0, k, 0],
[0, 0, k]])
# #### Dilatação de um vetor quando k = 2
# In[62]:
# realizando a transformação linear responsável por fazer uma contração no vetor
transformacaoLinear3d(vetor3d, matriz17)
# In[63]:
# visualizando o vetor antes da transformação linear
print(vetor3d)
# visualizando o vetor depois da transformação linear
print(np.dot(vetor3d, matriz17))
# ### Alguma Dúvida? Entre em Contato Comigo:
# - [Me envie um e-mail](mailto:alysson.barbosa@ee.ufcg.edu.br);