IPython Notebook 1 de 6 http://127.0.0.1:8888/320ef90b-f34f-4a03-a174-382e132ecd51/... Vetores em Python Disciplina "Introdução à Computação em Física" (ICF) da UFES/Alegre Curso de Licenciatura em Física - Turma 2012/2 Autoria : Prof. Roberto Colistete Jr., em 04/2013. Listas em Python puro não são vetores matemáticos : Listas são coleção de objetos em Python : In [1]: vetor1 = [1,2,3] In [2]: vetor1[0] Out[2]: 1 In [3]: vetor1[1] Out[3]: 2 In [4]: vetor1[0:2] Out[4]: [1, 2] In [5]: vetor1[-1] Out[5]: 3 In [6]: len(vetor1) Out[6]: 3 "append" na verdade é um método do objeto vetor1 que é da classe list. Um pouquinho de OOP (Object Oriented Programming)... In [7]: vetor1.append("ola") In [8]: vetor1 Out[8]: [1, 2, 3, 'ola'] 19-04-2013 00:51 IPython Notebook 2 de 6 http://127.0.0.1:8888/320ef90b-f34f-4a03-a174-382e132ecd51/... "del" permite apagar elementos de uma lista : In [9]: del vetor1[-1] In [10]: vetor1 Out[10]: [1, 2, 3] Listas são usadas pela estrutura de repetição "for" : In [11]: for i in vetor1: print 2**i 2 4 8 Mas listas não se comportam como vetores matemáticos : In [12]: 1 + vetor1 --------------------------------------------------------------------------TypeError Traceback (most recent call last) <ipython-input-12-40437d7529f1> in <module>() ----> 1 1 + vetor1 TypeError: unsupported operand type(s) for +: 'int' and 'list' In [13]: vetor1 + vetor1 Out[13]: [1, 2, 3, 1, 2, 3] In [14]: vetor1 * 3 Out[14]: [1, 2, 3, 1, 2, 3, 1, 2, 3] Usando NumPy para vetores numéricos : Com NumPy temos "array" que permite definir vetores (e matrizes, etc) matemáticos, incluindo produto escalar, etc. A limitação é que só para valores numéricos. In [15]: import numpy as np A função "array" do NumPy define um vetor numérico : 19-04-2013 00:51 IPython Notebook 3 de 6 http://127.0.0.1:8888/320ef90b-f34f-4a03-a174-382e132ecd51/... In [16]: vetor2 = np.array([1, 2, 3]) In [17]: vetor2 Out[17]: array([1, 2, 3]) In [18]: vetor2[0] Out[18]: 1 In [19]: 1 + vetor2 Out[19]: array([2, 3, 4]) In [20]: vetor2 Out[20]: array([1, 2, 3]) In [21]: vetor2 + vetor2 Out[21]: array([2, 4, 6]) In [22]: vetor2 * 3 Out[22]: array([3, 6, 9]) In [23]: vetor2**2 Out[23]: array([1, 4, 9]) In [24]: np.sin(vetor2) Out[24]: array([ 0.84147098, 0.90929743, 0.14112001]) In [25]: vetor3 = np.array([4, 5, 6]) Produto escalar (interno) é via função "dot" do NumPy : In [26]: np.dot(vetor2, vetor3) Out[26]: 32 In [27]: np.sqrt(np.dot(vetor2, vetor2)) Out[27]: 3.7416573867739413 19-04-2013 00:51 IPython Notebook 4 de 6 http://127.0.0.1:8888/320ef90b-f34f-4a03-a174-382e132ecd51/... In [28]: np.linalg.norm(vetor2) Out[28]: 3.7416573867739413 O produto via "*" não é produto escalar, e sim o produto de termo a termo de cada vetor : In [29]: vetor2*vetor3 Out[29]: array([ 4, 10, 18]) Produto vetorial é via função "cross" do NumPy : In [30]: np.cross(vetor2, vetor3) Out[30]: array([-3, 6, -3]) In [31]: np.cross(vetor2, vetor2) Out[31]: array([0, 0, 0]) Usando SymPy (Matrix) para vetores com termos simbólicos : In [32]: from sympy import * Função "Matrix" define um vetor (que é um caso específico de uma matriz, aqui um vetor coluna 3x1) : In [33]: vetor4 = Matrix(3,1,[1,2,3]) In [34]: vetor4 Out[34]: [1] [2] [3] "dot" é um método do vetor para calcular o produto escalar : In [35]: vetor4.dot(vetor4) Out[35]: 14 "cross" é um método do vetor para calcular o produto vetorial : 19-04-2013 00:51 IPython Notebook 5 de 6 http://127.0.0.1:8888/320ef90b-f34f-4a03-a174-382e132ecd51/... In [36]: vetor4.cross(vetor4) Out[36]: [0, 0, 0] Vetores com elementos simbólicos : In [37]: t, R, omega = symbols("t, R, omega") Vetor posição de um movimento circular uniforme em 2D : In [38]: r = Matrix(2,1,[R*cos(omega*t),R*sin(omega*t)]) In [39]: r Out[39]: [R*cos(omega*t)] [R*sin(omega*t)] In [40]: r.dot(r) Out[40]: R**2*sin(omega*t)**2 + R**2*cos(omega*t)**2 In [41]: simplify(r.dot(r)) Out[41]: R**2 Vetor velocidade é a derivada do vetor posição em relação ao tempo t, onde "diff" é um método do vetor : In [42]: v = r.diff(t); v Out[42]: [-R*omega*sin(omega*t)] [ R*omega*cos(omega*t)] In [43]: simplify(v.dot(v)) Out[43]: R**2*omega**2 Vetor posição r é ortogonal ao vetor velocidade v : In [44]: r.dot(v) Out[44]: 0 Vetor aceleração é a derivada do vetor velocidade em relação ao tempo t : 19-04-2013 00:51 IPython Notebook 6 de 6 http://127.0.0.1:8888/320ef90b-f34f-4a03-a174-382e132ecd51/... In [45]: a = v.diff(t); a Out[45]: [-R*omega**2*cos(omega*t)] [-R*omega**2*sin(omega*t)] In [46]: simplify(a.dot(a)) Out[46]: Ou seja, a R**2*omega**4 = v 2 /R : In [47]: simplify(v.dot(v))/R Out[47]: R*omega**2 Vetor velocidade v é ortogonal ao vetor aceleração a : In [48]: v.dot(a) Out[48]: 0 19-04-2013 00:51