Vetores e matrizes
Um vetor é uma lista simples de números, como uma direção no espaço ou um conjunto de quantidades. Uma matriz é uma lista de linhas. Esta página explica produtos escalar e vetorial, multiplicação de matrizes, determinantes, matrizes inversas, resolução de sistemas lineares e ferramentas numéricas de álgebra linear: autovalores e decomposições QR, LU e em valores singulares.
Use esses recursos em estudos de álgebra linear, geometria e transformações, ou em problemas com várias incógnitas relacionadas por equações lineares. Vetores e matrizes são listas comuns; por isso, tudo em Listas e estatísticas, como o acesso por índices, também se aplica.
Vetores
dot([1, 2, 3], [4, 5, 6]) resulta em 32dot([3, 4], [4, -3]) resulta em 0cross([1, 0, 0], [0, 1, 0]) resulta em [0, 0, 1]cross([1, 2, 3], [4, 5, 6]) resulta em [-3, 6, -3]v = [3, 4]sqrt(dot(v, v)) resulta em 5dot multiplica os elementos correspondentes e soma os produtos. Um produto escalar igual a zero indica vetores perpendiculares, como [3, 4] e [4, -3]. cross retorna um vetor perpendicular aos dois vetores de entrada: o produto vetorial da direção x pela direção y resulta na direção z. O módulo de um vetor é a raiz quadrada do produto escalar dele por ele mesmo.
dot precisa de dois vetores do mesmo comprimento, e a cross precisa de dois vetores de três elementos. Para adicionar vetores ou dimensioná-los, use aritmética de lista comum: [1, 2] + [3, 4] é [4, 6] e 2 * [3, 4] é [6, 8]
Escrevendo e multiplicando matrizes
Escreva uma matriz como uma lista de linhas, cada linha em seus próprios colchetes:
shape([[1, 2, 3], [4, 5, 6]]) resulta em [2, 3]transpose([[1, 2, 3], [4, 5, 6]]) resulta em [[1, 4], [2, 5], [3, 6]]identity(3) resulta em [[1, 0, 0], [0, 1, 0], [0, 0, 1]][[1, 2], [3, 4]] * [[5, 6], [7, 8]] resulta em [[19, 22], [43, 50]]shape retorna [rows, columns]. transpose troca linhas por colunas. identity(n) é a matriz n por n que não altera outra matriz ao multiplicá-la.
* entre duas matrizes é a multiplicação da matriz, que precisa que a matriz esquerda tenha tantas colunas quanto a matriz direita tem linhas. Para multiplicar uma matriz por um vetor, escreva o vetor como uma coluna, um elemento por linha:
# Rotate the point (3, 1) by 90° anticlockwiserotate = [[0, -1], [1, 0]]rotate * [[3], [1]] resulta em [[-1], [3]]rotate * rotate resulta em [[-1, 0], [0, -1]]Girar duas vezes por 90° dá meia volta, e é por isso que rotate * rotate vira ambos os sinais. Uma lista plana como [3, 1] não é aceita à direita de uma matriz. Se você tiver uma lista plana em um nome, transpose([v]) a transforma em uma coluna.
Matrizes da mesma forma podem ser adicionadas e subtraídas, e multiplicadas ou divididas por um valor numérico, como outras listas.
Algumas regras se aplicam a todas as operações de matriz:
- Cada linha deve ter o mesmo número de elementos.
- Os elementos devem ser números simples. Unidades e dinheiro não são aceitos.
- Uma matriz pode ter no máximo 32 linhas e 32 colunas.
- Não há abreviação de ponto e vírgula. Escreva
[[1, 2], [3, 4]], não[1, 2; 3, 4].
Determinante, inversa, traço e posto
M = [[2, 1], [5, 3]]det(M) resulta em 1inverse(M) resulta em [[3, -1], [-5, 2]]M * inverse(M) resulta em [[1, 0], [0, 1]]trace(M) resulta em 5inverse([[2, 1], [1, 3]]) resulta em [[0.6, -0.2], [-0.2, 0.4]]det([[1, 2], [2, 4]]) resulta em 0rank([[1, 2, 3], [2, 4, 6]]) resulta em 1det, inverse e trace (soma da diagonal) exigem uma matriz quadrada. Determinante zero indica uma matriz singular: suas linhas não são independentes e não existe inversa; por isso, inverse([[1, 2], [2, 4]]) produz erro. rank calcula o número de linhas independentes e também aceita matrizes não quadradas. Na última linha, a segunda linha da matriz é o dobro da primeira, portanto o posto é 1.
Essas quatro funções usam frações exatas em vez de aproximações decimais. Por isso, M * inverse(M) resulta exatamente na matriz identidade.
Resolva um sistema linear
Suponha que três cafés e dois chás custem £ 13,50, e um café e quatro chás custam £ 11,50. Coloque o número de cada bebida em uma linha por equação, com as colunas em ordem fixa (café, chá) e os totais em uma lista correspondente:
solve_system([[3, 2], [1, 4]], [13.5, 11.5]) resulta em [3.1, 2.1]A resposta segue a ordem das colunas: um café custa £3,10 e um chá, £2,10. Omita os símbolos de moeda, pois os elementos da matriz precisam ser números sem unidades.
solve_system(A, b) resolve A * x = b para encontrar x. Exige uma matriz quadrada, com uma linha por incógnita, e uma lista simples dos valores do lado direito com o mesmo tamanho. Usa frações exatas, portanto o resultado não tem erro de arredondamento.
Se as equações não determinarem uma única resposta, a mensagem informa que o sistema não tem solução única. Por exemplo, solve_system([[1, 2], [2, 4]], [3, 6]) falha porque a segunda equação é o dobro da primeira. solve_system resolve apenas equações lineares. Para uma equação como x^2 = 2, use solve, descrita em Somatórios, resolução de equações e cálculo.
Autovalores
eigenvalues([[2, 1], [1, 2]]) resulta em [1, 3]eigenvalues([[4, 1], [2, 3]]) resulta em [5, 2]eigenvalues([[0, -1], [1, 0]]) resulta em [i, -i]eigenvalues recebe uma matriz quadrada e retorna uma lista simples. Uma rotação de 90° não preserva nenhuma direção; seus autovalores são o par complexo i e -i. Veja Números complexos. A ordem dos elementos da lista não é garantida.
Decomposições: QR, LU e SVD
Cada decomposição retorna uma lista de matrizes. Use índices para retirar as peças:
A = [[3, 0], [4, 5]]parts = qr(A)q = parts[0] resulta em [[0.6, -0.8], [0.8, 0.6]]r = parts[1] resulta em [[5, 4], [0, 3]]q * r resulta em [[3, 0], [4, 5]]Multiplicar os fatores entre si reconstrói A, permitindo conferir a decomposição. Cálculos em ponto flutuante binário deixam pequenos resíduos de arredondamento, da ordem de 10⁻¹⁵, que Varlig exibe como 0 em listas e matrizes. Os valores armazenados preservam todos os dígitos; por isso, confira os resultados visualmente ou pela diferença entre eles, não com ==.
lu([[2, 1], [4, 3]]) resulta em [[[0, 1], [1, 0]], [[1, 0], [0.5, 1]], [[4, 3], [0, -0.5]]]lu retorna [P, L, U], onde P registra quaisquer trocas de linha e P * A é igual a L * U. Aqui as linhas foram trocadas para que o número maior, 4, seja usado primeiro.
B = [[3, 1], [4, 7]]f = svd(B)u = f[0]s = f[1]vt = f[2]u * [[s[0], 0], [0, s[1]]] * vt resulta em [[3, 1], [4, 7]]svd([[3, 4]]) resulta em [[[1]], [5], [[0.6, 0.8]]]svd retorna [U, s, Vt], onde s é uma lista plana de valores singulares, o maior primeiro. Em livros didáticos, B é igual a U * diag(s) * Vt. Não há função diag, então construa a matriz diagonal você mesmo, como em [[s[0], 0], [0, s[1]]].
| Função | O que ele precisa e retorna |
|---|---|
identity(n) |
A matriz identidade de dimensões n por n |
shape(A) |
[rows, columns] |
transpose(A) |
Linhas e colunas trocadas |
det(A) |
Determinante de uma matriz quadrada |
inverse(A) |
Inversa de uma matriz quadrada com determinante diferente de zero |
trace(A) |
Soma da diagonal de uma matriz quadrada |
rank(A) |
Número de linhas independentes; qualquer matriz retangular |
solve_system(A,b) |
Solução de A * x = b para uma matriz quadrada com uma única solução |
eigenvalues(A) |
Autovalores de uma matriz quadrada, possivelmente complexos, sem uma ordem específica |
qr(A) |
[Q, R] com Q * R aproximadamente A; qualquer matriz retangular |
lu(A) |
[P, L, U] com P * A aproximadamente L * U; matriz quadrada |
svd(A) |
[U, s, Vt], onde s é uma lista plana; qualquer matriz retangular |
Para matrizes não quadradas, qr e svd retornam os fatores na forma reduzida: em uma matriz 3 por 2, Q também é 3 por 2, em vez de 3 por 3.
O que é exato e o que é recusado
Soma, subtração e multiplicação de matrizes, multiplicação por um número, transpose, det e inverse usam frações exatas em todas as matrizes aceitas pelo Varlig. Não há arredondamento na entrada nem ao reutilizar o resultado em outro cálculo. Por isso, multiplicar uma matriz pela sua inversa retorna exatamente a matriz identidade:
[[1, 2], [3, 4]] + [[10, 20], [30, 40]] resulta em [[11, 22], [33, 44]][[1, 2], [3, 4]] - [[1, 1], [1, 1]] resulta em [[0, 1], [2, 3]]3 * [[1, 2], [3, 4]] resulta em [[3, 6], [9, 12]][[1, 2], [3, 4]] * [[0, 1], [1, 0]] resulta em [[2, 1], [4, 3]]det([[1, 2], [3, 4]]) resulta em -2inverse([[1, 2], [3, 4]]) resulta em [[-2, 1], [1.5, -0.5]]inverse([[1, 2], [3, 4]]) * [[1, 2], [3, 4]] resulta em [[1, 0], [0, 1]]Todas as condições são verificadas antes que uma resposta apareça, e a mensagem diz qual delas falhou:
det([[1, 2, 3], [4, 5, 6]]) resulta em Unsupported: Expected a square matrixinverse([[1, 2], [2, 4]]) resulta em Unsupported: Singular matrix has no inverse[[1, 2], [3, 4]] + [[1, 2, 3], [4, 5, 6]] resulta em Unsupported: List dimensions do not match[[1, 2, 3], [4, 5, 6]] * [[1, 2], [3, 4]] resulta em Unsupported: Matrix inner dimensions do not matchOs elementos de uma matriz precisam ser números sem unidades. Uma unidade, um valor monetário ou um número complexo em qualquer posição interrompe o cálculo, pois as operações de matriz não preservam esses tipos de valor:
det([[1 kg, 2], [3, 4]]) resulta em Unsupported: Matrix entries must be plain numbers; units, money and complex values are not supportedApenas uma lista de linhas é lida como uma matriz. Uma lista plana mantém seu próprio significado, então [1, 2] + [3, 4] ainda é o item por item [4, 6], e [1, 2] * [3, 4] ainda é um erro apontando para dot.
Para as regras de exatidão em equações, matrizes e estatísticas em um só lugar, consulte O que o mecanismo garante.
Algoritmos e limites
det, inverse, rank e solve_system funcionam com frações exatas, dentro dos limites da calculadora sobre o tamanho de um valor numérico. eigenvalues, qr, lu e svd funcionam em ponto flutuante binário, então suas respostas são aproximações próximas. Suas iterações param após 10.000 passos.
Matrizes cujas linhas são quase dependentes, como [[1, 1], [1, 1.0000001]], são chamadas de malcondicionadas. Pequenos erros de arredondamento crescem quando você trabalha com eles, portanto, decomposições e autovalores de tais matrizes podem perder precisão, e casos muito extremos podem exceder os limites numéricos e dar um erro.
As regras completas estão na referência matemática avançada.
Combinando os recursos
Três recibos de uma barraca de mercado listam quantas maçãs, bananas e laranjas foram compradas e o total pago, mas não os preços individuais:
# Each row: apples, bananas, orangesbaskets = [[2, 3, 1], [1, 2, 3], [4, 1, 2]]paid = [2.15, 2.70, 3.05]det(baskets) resulta em 25prices = solve_system(baskets, paid) resulta em [0.4, 0.25, 0.6]# Check the prices against every receiptbaskets * transpose([prices]) resulta em [[2.15], [2.7], [3.05]]# What would 5 apples, 2 bananas and 4 oranges cost?dot([5, 2, 4], prices) resulta em 4.9O determinante diferente de zero confirma que os recibos são suficientes para encontrar um conjunto de preços: maçãs a 40p, bananas a 25p e laranjas a 60p. Multiplicar as cestas pelos preços como uma coluna reproduz os totais, e dot precifica uma nova cesta em £4,90.