| | | |

Algoritmos e Programação I

5 Arranjos e matrizes

Compre o e-book deste material aqui! Consulte outras formas de colaborar.

5.2 Vetores

O uso de arrays é uma das formas mais adequadas para fazermos a modelagem computacional de vetores. Entretanto, devemos ficar atentos que vetores e arranjos não são equivalentes. Embora, a soma/subtração e multiplicação por escalar são similares, a multiplicação e potenciação envolvendo vetores não estão definidas, mas para arranjos são operações elemento-a-elemento.

No que segue, vamos assumir que a biblioteca NumPy está importada, i.e.

1import numpy as np
Exemplo 5.2.1.

Podemos alocar os vetores

𝒗=(1,0,2), (5.10)
𝒘=(2,1,3), (5.11)

como arrays do NumPy

1v = np.array([1, 0, -2])
2w = np.array([2, -1, 3])

A soma dos vetores é uma operação elemento-a-elemento

𝒗+𝒘=(1,0,2)+(2,1,3) (5.12)
=(1+2,0+(1),2+3) (5.13)
=(3,1,1) (5.14)

e a dos arrays é equivalente

1v+w
array([ 3, -1,  1])

A subtração dos vetores também é uma operação elemento-a-elemento

𝒗𝒘=(1,0,2)(2,1,3) (5.15)
=(12,0(1),23) (5.16)
=(1,1,5) (5.17)

e a dos arrays é equivalente

1v-w
array([ -1, 1,  -5])

Ainda, a multiplicação por escalar

2𝒗=2(1,0,2) (5.18)
=(21,20,2(2)) (5.19)
=(2,0,4) (5.20)

também é feita elemento-a-elemento, assim como com arrays

12*v
array([ 2,  0, -4])

Agora, para vetores, a multiplicação 𝒗𝒘, divisão 𝒗/𝒘, potenciação 𝒗2 não são operações definidas. Diferentemente, para arranjos são operações elemento-a-elemento

1v*w
array([ 2,  0, -6])
1v/w
array([ 0.5, -0., -0.66666667])
1v**2
array([1, 0, 4])

5.2.1 Funções vetoriais

Funções vetoriais f:nn e funcionais f:n também podem ser adequadamente modeladas com o emprego de arrays do NumPy. A biblioteca também conta com várias funções matemáticas predefinidas, consulte

https://numpy.org/doc/stable/reference/routines.math.html

Exemplo 5.2.2 (Função vetorial).

A implementação da função vetorial 𝒇:33

𝒇(𝒙)=(x12+sin(x1),x22+sin(x2),x32+sin(x3)) (5.21)

para 𝒙=(x1,x2,x3)3, pode ser feita da seguinte forma

1import numpy as np
2
3def f(x):
4  return x**2 + np.sin(x)
5
6# exemplo
7x = np.array([0, np.pi, np.pi/2])
8print(f'y = {f(x)}')

Verifique!

5.2.2 Produto interno

O produto interno (ou, produto escalar) é a operação entre vetores 𝒗,𝒘n definida por

𝒗𝒘:=v1w1+v2w2++vnwn. (5.22)

A função numpy.dot computa o produto interno dos arrays.

Exemplo 5.2.3.

Consideramos os vetores

𝒗=(1,0,2), (5.23)
𝒘=(2,1,3). (5.24)

O produto interno desses vetores é

𝒗𝒘=v1w1+v2w2+v3w3 (5.25)
=12+0(1)+(2)3 (5.26)
=2+06=4. (5.27)

Usando arrays, temos

1v = np.array([1, 0, -2])
2w = np.array([2, -1, 3])
3np.sum(v*w)
-4
1np.dot(v,w)
-4

5.2.3 Norma de vetores

A norma L2 de um vetor 𝒗n é definida por

𝒗:=v12+v22++vn2 (5.28)

O submódulo de álgebra linear numpy.linalg contém a função numpy.linalg.norm para a computação da norma de arrays.

Exemplo 5.2.4.

A norma do vetor 𝒗=(3,0,4) é

𝒗=v12+v22+v32 (5.29)
=32+02+(4)2 (5.30)
=9+0+16 (5.31)
=25=5. (5.32)

Usando o módulo numpy.linalg, obtemos

1import numpy as np
2import numpy.linalg as npla
3v = np.array([3, 0, -4])
4np.sqrt(np.dot(v,v))
5.0
1npla.norm(v)
5.0

5.2.4 Produto vetorial

O produto vetorial entre dois vetores 𝒗,𝒘3 é definido por

𝒗×𝒘:=|𝒊𝒋𝒌v1v2v3w1w2w3| (5.36)
=|v2v3w2w3|𝒊 (5.39)
|v1v3w1w3|𝒋 (5.42)
+|v1v2w1w2|𝒌 (5.45)

A função numpy.cross computa o produto vetorial entre arrays (unidimensionais de 3 elementos).

Exemplo 5.2.5.

O produto vetorial entre os vetores 𝒗=(1,2,1) e 𝒘=(0,2,1) é

𝒗×𝒘=|𝒊𝒋𝒌121021| (5.50)
=0𝒊+𝒋+2𝒌 (5.51)
=(0,1,2). (5.52)

Com o NumPy, temos

1v = np.array([1, -2, 1])
2w = np.array([0, 2, -1])
3np.cross(v,w)
array([0, 1, 2])

5.2.5 Exercícios

E. 5.2.1.

Complete as lacunas.

  1. a)

    Usualmente, vetores são computacionalmente modelados como numpy.array.

  2. b)

    O produto interno de dois vetores alocados como arrays pode ser computado com o método numpy.dot.

  3. c)

    A norma L2 de um vetor alocado como um numpy.array pode ser computado com o método numpy.linalg.norm.

Resposta.
E. 5.2.2.

Considere os seguintes vetores

𝒖=(2,1,1), (5.53)
𝒗=(1,3,2), (5.54)
𝒘=(2,1,3). (5.55)

Usando arrays do NumPy, compute:

  1. a)

    𝒖𝒗

  2. b)

    𝒖(2𝒗)

  3. c)

    𝒖(𝒘+𝒗)

  4. d)

    𝒗(𝒗2𝒖)

Resposta.

Dica: use a função np.dot() e verifique as computações calculando os resultados esperados.

E. 5.2.3.

Considere os seguintes vetores

𝒖=(2,1,1), (5.56)
𝒗=(1,3,2), (5.57)
𝒘=(2,1,3). (5.58)

Usando arrays do NumPy, compute:

  1. a)

    𝒖

  2. b)

    𝒖+𝒗

  3. c)

    |𝒖𝒘|

Resposta.

Dica: use a função numpy.linalg.norm e verifique as computações calculando os resultados esperados.

E. 5.2.4.

Dados vetores 𝒖 e 𝒗, temos que

𝒖𝒗=𝒖𝒗cosθ, (5.59)

onde θ é o ângulo entre esses vetores. Implemente uma função que recebe dois vetores e retorna o ângulo entre eles. Teste seu código para diferentes vetores.

Resposta.
1import numpy as np
2import numpy.linalg as npla
3
4def angulo(v, w):
5  # \|v\|
6  norm_v = npla.norm(v)
7  # \|w\|
8  norm_w = npla.norm(w)
9  # u.v
10  vdw = np.dot(v, w)
11  # cos \theta
12  ct = norm_v*norm_w/udw
13  return np.acos(ct)
E. 5.2.5.

A projeção ortogonal do vetor 𝒖 na direção do vetor 𝒗 é definida por

proj𝒗𝒖:=𝒖𝒗𝒗2𝒗. (5.60)

Implemente uma função que recebe dois vetores 𝒖, 𝒗 e retorne a projeção de 𝒖 na direção de 𝒗. Teste seu código para diferentes vetores.

Resposta.
1import numpy as np
2import numpy.linalg as npla
3
4def proj(u, v):
5  # \|v\|
6  norm_v = npla.norm(v)
7  # u.v
8  udv = np.dot(u, v)
9  # proj_v u
10  proj_vu = udv/norm_v**2 * v
11  return proj_vu
E. 5.2.6.

Considere os vetores

𝒖=(2,3,1), (5.61)
𝒗=(1,2,1). (5.62)

Usando arrays do NumPy, compute os seguintes produtos vetoriais:

  1. a)

    𝒖×𝒗

  2. b)

    𝒗×(2𝒗)

Resposta.

Dica: use a função numpy.cross e verifique as computações calculando os resultados esperados.


Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Algoritmos e Programação I

5 Arranjos e matrizes

Compre o e-book deste material aqui! Consulte outras formas de colaborar.

5.2 Vetores

O uso de arrays é uma das formas mais adequadas para fazermos a modelagem computacional de vetores. Entretanto, devemos ficar atentos que vetores e arranjos não são equivalentes. Embora, a soma/subtração e multiplicação por escalar são similares, a multiplicação e potenciação envolvendo vetores não estão definidas, mas para arranjos são operações elemento-a-elemento.

No que segue, vamos assumir que a biblioteca NumPy está importada, i.e.

1import numpy as np
Exemplo 5.2.1.

Podemos alocar os vetores

𝒗=(1,0,2), (5.10)
𝒘=(2,1,3), (5.11)

como arrays do NumPy

1v = np.array([1, 0, -2])
2w = np.array([2, -1, 3])

A soma dos vetores é uma operação elemento-a-elemento

𝒗+𝒘=(1,0,2)+(2,1,3) (5.12)
=(1+2,0+(1),2+3) (5.13)
=(3,1,1) (5.14)

e a dos arrays é equivalente

1v+w
array([ 3, -1,  1])

A subtração dos vetores também é uma operação elemento-a-elemento

𝒗𝒘=(1,0,2)(2,1,3) (5.15)
=(12,0(1),23) (5.16)
=(1,1,5) (5.17)

e a dos arrays é equivalente

1v-w
array([ -1, 1,  -5])

Ainda, a multiplicação por escalar

2𝒗=2(1,0,2) (5.18)
=(21,20,2(2)) (5.19)
=(2,0,4) (5.20)

também é feita elemento-a-elemento, assim como com arrays

12*v
array([ 2,  0, -4])

Agora, para vetores, a multiplicação 𝒗𝒘, divisão 𝒗/𝒘, potenciação 𝒗2 não são operações definidas. Diferentemente, para arranjos são operações elemento-a-elemento

1v*w
array([ 2,  0, -6])
1v/w
array([ 0.5, -0., -0.66666667])
1v**2
array([1, 0, 4])

5.2.1 Funções vetoriais

Funções vetoriais f:nn e funcionais f:n também podem ser adequadamente modeladas com o emprego de arrays do NumPy. A biblioteca também conta com várias funções matemáticas predefinidas, consulte

https://numpy.org/doc/stable/reference/routines.math.html

Exemplo 5.2.2 (Função vetorial).

A implementação da função vetorial 𝒇:33

𝒇(𝒙)=(x12+sin(x1),x22+sin(x2),x32+sin(x3)) (5.21)

para 𝒙=(x1,x2,x3)3, pode ser feita da seguinte forma

1import numpy as np
2
3def f(x):
4  return x**2 + np.sin(x)
5
6# exemplo
7x = np.array([0, np.pi, np.pi/2])
8print(f'y = {f(x)}')

Verifique!

5.2.2 Produto interno

O produto interno (ou, produto escalar) é a operação entre vetores 𝒗,𝒘n definida por

𝒗𝒘:=v1w1+v2w2++vnwn. (5.22)

A função numpy.dot computa o produto interno dos arrays.

Exemplo 5.2.3.

Consideramos os vetores

𝒗=(1,0,2), (5.23)
𝒘=(2,1,3). (5.24)

O produto interno desses vetores é

𝒗𝒘=v1w1+v2w2+v3w3 (5.25)
=12+0(1)+(2)3 (5.26)
=2+06=4. (5.27)

Usando arrays, temos

1v = np.array([1, 0, -2])
2w = np.array([2, -1, 3])
3np.sum(v*w)
-4
1np.dot(v,w)
-4

5.2.3 Norma de vetores

A norma L2 de um vetor 𝒗n é definida por

𝒗:=v12+v22++vn2 (5.28)

O submódulo de álgebra linear numpy.linalg contém a função numpy.linalg.norm para a computação da norma de arrays.

Exemplo 5.2.4.

A norma do vetor 𝒗=(3,0,4) é

𝒗=v12+v22+v32 (5.29)
=32+02+(4)2 (5.30)
=9+0+16 (5.31)
=25=5. (5.32)

Usando o módulo numpy.linalg, obtemos

1import numpy as np
2import numpy.linalg as npla
3v = np.array([3, 0, -4])
4np.sqrt(np.dot(v,v))
5.0
1npla.norm(v)
5.0

5.2.4 Produto vetorial

O produto vetorial entre dois vetores 𝒗,𝒘3 é definido por

𝒗×𝒘:=|𝒊𝒋𝒌v1v2v3w1w2w3| (5.36)
=|v2v3w2w3|𝒊 (5.39)
|v1v3w1w3|𝒋 (5.42)
+|v1v2w1w2|𝒌 (5.45)

A função numpy.cross computa o produto vetorial entre arrays (unidimensionais de 3 elementos).

Exemplo 5.2.5.

O produto vetorial entre os vetores 𝒗=(1,2,1) e 𝒘=(0,2,1) é

𝒗×𝒘=|𝒊𝒋𝒌121021| (5.50)
=0𝒊+𝒋+2𝒌 (5.51)
=(0,1,2). (5.52)

Com o NumPy, temos

1v = np.array([1, -2, 1])
2w = np.array([0, 2, -1])
3np.cross(v,w)
array([0, 1, 2])

5.2.5 Exercícios

E. 5.2.1.

Complete as lacunas.

  1. a)

    Usualmente, vetores são computacionalmente modelados como numpy.array.

  2. b)

    O produto interno de dois vetores alocados como arrays pode ser computado com o método numpy.dot.

  3. c)

    A norma L2 de um vetor alocado como um numpy.array pode ser computado com o método numpy.linalg.norm.

Resposta.
E. 5.2.2.

Considere os seguintes vetores

𝒖=(2,1,1), (5.53)
𝒗=(1,3,2), (5.54)
𝒘=(2,1,3). (5.55)

Usando arrays do NumPy, compute:

  1. a)

    𝒖𝒗

  2. b)

    𝒖(2𝒗)

  3. c)

    𝒖(𝒘+𝒗)

  4. d)

    𝒗(𝒗2𝒖)

Resposta.

Dica: use a função np.dot() e verifique as computações calculando os resultados esperados.

E. 5.2.3.

Considere os seguintes vetores

𝒖=(2,1,1), (5.56)
𝒗=(1,3,2), (5.57)
𝒘=(2,1,3). (5.58)

Usando arrays do NumPy, compute:

  1. a)

    𝒖

  2. b)

    𝒖+𝒗

  3. c)

    |𝒖𝒘|

Resposta.

Dica: use a função numpy.linalg.norm e verifique as computações calculando os resultados esperados.

E. 5.2.4.

Dados vetores 𝒖 e 𝒗, temos que

𝒖𝒗=𝒖𝒗cosθ, (5.59)

onde θ é o ângulo entre esses vetores. Implemente uma função que recebe dois vetores e retorna o ângulo entre eles. Teste seu código para diferentes vetores.

Resposta.
1import numpy as np
2import numpy.linalg as npla
3
4def angulo(v, w):
5  # \|v\|
6  norm_v = npla.norm(v)
7  # \|w\|
8  norm_w = npla.norm(w)
9  # u.v
10  vdw = np.dot(v, w)
11  # cos \theta
12  ct = norm_v*norm_w/udw
13  return np.acos(ct)
E. 5.2.5.

A projeção ortogonal do vetor 𝒖 na direção do vetor 𝒗 é definida por

proj𝒗𝒖:=𝒖𝒗𝒗2𝒗. (5.60)

Implemente uma função que recebe dois vetores 𝒖, 𝒗 e retorne a projeção de 𝒖 na direção de 𝒗. Teste seu código para diferentes vetores.

Resposta.
1import numpy as np
2import numpy.linalg as npla
3
4def proj(u, v):
5  # \|v\|
6  norm_v = npla.norm(v)
7  # u.v
8  udv = np.dot(u, v)
9  # proj_v u
10  proj_vu = udv/norm_v**2 * v
11  return proj_vu
E. 5.2.6.

Considere os vetores

𝒖=(2,3,1), (5.61)
𝒗=(1,2,1). (5.62)

Usando arrays do NumPy, compute os seguintes produtos vetoriais:

  1. a)

    𝒖×𝒗

  2. b)

    𝒗×(2𝒗)

Resposta.

Dica: use a função numpy.cross e verifique as computações calculando os resultados esperados.


Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |