A Lei de Hooke diz que a força aplicada a uma mola é proporcional ao comprimento de seu alongamento. Então, se F é a força aplicada e x é o alongamento da mola, então F = kx. A constante de proporcionalidade k é a constante da mola.
Na disciplina de Física Experimental I, alguns alunos de Engenharia Elétrica da UFCG querem determinar a constante da mola k para uma determinada mola. Eles aplicam forças de 13, 22 e 36 newtons, que alongam a mola em 10, 18 e 28 centímetros, respectivamente. Usando a Lei de Hooke, eles obtêm o seguinte sistema de equações:
Sistema de Equações: |
---|
0.10k = 13 |
0.18k = 22 |
0.28k = 36 |
Definindo a Matriz Ampliada para esse sistema, poderemos escrevê-lo da seguinte forma:
Graficamente, vamos observar as coordenadas (x,F) e analisar o seu comportamento. Se o valor de k, dada as três equações, estiver convergindo para um único valor, teremos a construção de uma reta.
# importando a biblioteca numpy do Python
import numpy as np
# importando a biblioteca de funções do Python matplotlib
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
# Valores de F e x para a primeira equação do sistema
x1, f1 = 0.10, 13
# Valores de F e x para a segunda equação do sistema
x2, f2 = 0.18, 22
# Valores de F e x para a terceira equação do sistema
x3, f3 = 0.28, 36
# uma lista com todos os valores de x do sistema de equações
x = [x1, x2, x3]
# uma lista com todos os valores de F do sistema de equações
f = [f1, f2, f3]
# definindo o tamanho do gráfico
plt.figure(figsize = (10, 5))
# plotandos os pontos definidos da primeira equação
plt.scatter(x1, f1, color = "red", label = "Coordenadas (x,F) Obtidas no Experimento")
# plotandos os pontos definidos da segunda equação
plt.scatter(x2, f2, color = "red")
# plotandos os pontos definidos da terceira equação
plt.scatter(x3, f3, color = "red")
# plotando o traço entre todos os pontos dos gráficos definidos
plt.plot(x, f, label = "Gráfico que Liga Todos os Pontos (x,F)")
# colocando uma grade no gráfico
plt.grid(True)
# remove a moldura do gráfico
plt.box(False)
# adiciona a etiqueta definida no gráfico plotado
plt.legend()
# adicionando o título do gráfico plotado
plt.title("Valores Obtidos por Cada Aluno na Experiência")
Text(0.5, 1.0, 'Valores Obtidos por Cada Aluno na Experiência')
Esse sistema é claramente incompatível. Já que cada uma das equações corresponde a um valor diferente de k. Além disso, se você estudou o progama sobre "Estudo de Sistema de Equações", você pode observar que o gráfico que liga todos os pontos dos valores obtidos pelos alunos na experiência, não formam uma reta. Então, por mais próximo que seja o valor de k, eles não convergem a uma solução única. Em vez de usar um desses valores, os alunos decidem calcular a solução de mínimos quadráticos para o sistema.
Até agora, preocupamo-nos essencialmente com sistemas de equações lineares compatíveis. Então, vamos considerar sistemas envolvendo mais equações do que incógnitas. Tais sistemas são, muitas vezes, incompatíveis. Então, dado um sistema $m_{x}n$ Ax = b com m > n, não podemos esperar, em geral, encontrar um vetor x ∈ $R^{n}$ para o qual Ax seja igual a b. Em vez disso, vamos procurar um vetor x para o qual Ax está "o mais próximo possível" de b.
Temos um sistema Ax = b.
que pode ser colocado da seguinte forma com a Matriz Ampliada:
Quando o sistema de equações é incompátivel, podemos encontrar valores aproximados para $x_{n}$ utilizando a seguinte fórmula:
que também pode ser simplificada, para facilitar aplicações computacionais, da seguinte forma:
Voltando ao exemplo anterior, vamos aplicar a fórmula acima e tentar estimar um valor para k, dada o sistema de equações abaixo:
Sistema de Equações: |
---|
0.10k = 13 |
0.18k = 22 |
0.28k = 36 |
Vamos definir a matriz ampliada A e a matriz b:
# definindo a matriz ampliada A
A = np.array([[x1], [x2], [x3]])
# definindo a matriz b
b = np.array([[f1], [f2], [f3]])
# imprimindo a matriz ampliada A
print("A matriz ampliada A é:\n\n", A)
A matriz ampliada A é: [[0.1 ] [0.18] [0.28]]
# imprimindo a matriz b
print("A matriz b é:\n\n", b)
A matriz b é: [[13] [22] [36]]
E com essas matrizes, vamos usá-las na fórmula:
que se resume em:
# definindo a matriz k
k = np.dot(np.dot(np.linalg.pinv(np.dot(A.transpose(), A)), A.transpose()), b)
# imprimindo o valor de x
print("O valor de k, obtido usando a técnica de mínimos quadráticos é: k = {:.3f}".
format(k[0][0]))
O valor de k, obtido usando a técnica de mínimos quadráticos é: k = 126.987
Observe agora qual seria os valores de x e F, da fórmula F = kx, nas coordenadas do gráfico (ponto verde), após ser utilizado o método dos mínimos quadráticos.
print("Usando o método de mínimos quadráticos, Teremos a Lei de Hooke: {:.4f}k = {:.2f}".
format((np.dot(A.transpose(), A))[0][0], (np.dot(A.transpose(), b))[0][0]))
Usando o método de mínimos quadráticos, Teremos a Lei de Hooke: 0.1208k = 15.34
# Valores de F e x para a primeira equação do sistema
x1, f1 = 0.10, 13
# Valores de F e x para a segunda equação do sistema
x2, f2 = 0.18, 22
# Valores de F e x para a terceira equação do sistema
x3, f3 = 0.28, 36
# uma lista com todos os valores de x do sistema de equações
x = [x1, x2, x3]
# uma lista com todos os valores de F do sistema de equações
f = [f1, f2, f3]
# definindo o tamanho do gráfico
plt.figure(figsize = (10, 5))
# plotandos os pontos definidos da primeira equação
plt.scatter(x1, f1, color = "red", label = "Coordenadas (x,F) Obtidas no Experimento")
# plotandos os pontos definidos da segunda equação
plt.scatter(x2, f2, color = "red")
# plotandos os pontos definidos da terceira equação
plt.scatter(x3, f3, color = "red")
# plotando o ponto obtido pelo método de mínimos quadráticos
#plt.scatter(np.dot(A.transpose(), A), np.dot(A.transpose(), b), color = "green",
# label = "Coordenada (x,F) Obtida pelo Método de Mínimos Quadráticos")
# plotando o traço entre todos os pontos dos gráficos definidos
plt.plot(x, f, label = "Gráfico que Liga Todos os Pontos (x,F)")
# definindo valores para x entre 0.100 até 0.280
valoresX = np.linspace(0.100, 0.280)
# plotando o gráfico obtido pelo método de mínimos quadráticos
plt.plot(valoresX, k[0][0] * valoresX, color = "Green",
label = "Gráfico Obtido Pelo Método de Mínimos Quadráticos")
# colocando uma grade no gráfico
plt.grid(True)
# remove a moldura do gráfico
plt.box(False)
# adiciona a etiqueta definida no gráfico plotado
plt.legend()
# adicionando o título do gráfico plotado
plt.title("Valores Obtidos por Cada Aluno na Experiência")
Text(0.5, 1.0, 'Valores Obtidos por Cada Aluno na Experiência')
Vamos agora encontrar a melhor reta que aproxima os pontos (-1,0), (0,1), (1,2) e (2,1).
Lembrando que a equação da reta é
A partir dessas coordenadas, vamos ter:
Sistema de Equações: |
---|
-a + b = 0 |
b = 1 |
a + b = 2 |
2a + b = 1 |
E teremos também os pontos no gráfico
# definindo o ponto (x,y) da primeira equação
x1, y1 = -1, 0
# definindo o ponto (x,y) da segunda equação
x2, y2 = 0, 1
# definindo o ponto (x,y) da terceira equação
x3, y3 = 1, 2
# definindo o ponto (x,y) da quarta equação
x4, y4 = 2, 1
# definindo uma lista com todas as coordenadas de x
x = [x1, x2, x3, x4]
# definindo uma lista com todas as coordenadas de y
y = [y1, y2, y3, y4]
# definindo o tamanho do gráfico
plt.figure(figsize = (10, 5))
# plotando o ponto definido na primeira equação
plt.scatter(x1, y1, color = "red", label = "Pontos (x,y) Obtidos para o Sistema de Equações")
# plotando o ponto definido na segunda equação
plt.scatter(x2, y2, color = "red")
# plotando o ponto definido na terceira equação
plt.scatter(x3, y3, color = "red")
# plotando o ponto definido na quarta equação
plt.scatter(x4, y4, color = "red")
# plotando o gráfico que liga todos os pontos definidos
plt.plot(x, y, label = "Gráfico que Liga Todos os Pontos da Reta")
# definindo uma grade para o gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# colocando a legenda no gráfico
plt.legend()
# colocando um título no gráfico
plt.title("Interpolando uma Reta Sobre os Pontos Informados")
Text(0.5, 1.0, 'Interpolando uma Reta Sobre os Pontos Informados')
Dessa forma, assim como a primeira aplicação, os valores x e y não convergem a um valor único levando em consideração o sistema informado, logo temos novamente um sistema incompatível e será conveniente usar o método de mínimos quadráticos novamente.
que se resume em:
Podemos reescrever o sistema, usando Matrizes Ampliadas, da seguinte forma:
Vamos definir a matriz ampliada A e a matriz b:
# definindo a matriz ampliada A
A = np.array([[-1, 1], [0, 1], [1, 1], [2, 1]])
# definindo a matriz b
b = np.array([[0], [1], [2], [1]])
# imprimindo a matriz ampliada A
print("A matriz A é:\n\n", A)
A matriz A é: [[-1 1] [ 0 1] [ 1 1] [ 2 1]]
# imprimindo a matriz b
print("A matriz b é:\n\n", b)
A matriz b é: [[0] [1] [2] [1]]
Vamos aplicar o método de mínimos quadráticos, para descobrir um valor aproximado para a e b:
# usando o método de mínimos quadráticos para descobrir a e b
(a, b) = np.dot(np.dot(np.linalg.pinv(np.dot(A.transpose(), A)), A.transpose()), b)
# imprimindo o valor de a e b
print("Usando o método de mínimos quadráticos, teremos: (a = {:.1f}, b = {:.1f})".
format(float(a), float(b)))
Usando o método de mínimos quadráticos, teremos: (a = 0.4, b = 0.8)
E assim, teremos o gráfico abaixo:
# definindo o ponto (x,y) da primeira equação
x1, y1 = -1, 0
# definindo o ponto (x,y) da segunda equação
x2, y2 = 0, 1
# definindo o ponto (x,y) da terceira equação
x3, y3 = 1, 2
# definindo o ponto (x,y) da quarta equação
x4, y4 = 2, 1
# definindo uma lista com todos os valores de x informados
x = [x1, x2, x3, x4]
# definindo uma lista com todos os valores de y informados
y = [y1, y2, y3, y4]
# definindo o tamanho do gráfico
plt.figure(figsize = (10, 5))
# plotando o ponto (x,y) da primeira equação
plt.scatter(x1, y1, color = "red", label = "Pontos (x,y) Obtidos para o Sistema de Equações")
# plotando o ponto (x,y) da segunda equação
plt.scatter(x2, y2, color = "red")
# plotando o ponto (x,y) da terceira equação
plt.scatter(x3, y3, color = "red")
# plotando o ponto (x,y) da quarta equação
plt.scatter(x4, y4, color = "red")
# definindo uma lista de valores de x para serem usados em cada ponto da reta, entre -1 e 2
valoresX = np.linspace(-1,2)
# plotando o gráfico que liga todos os pontos informados
plt.plot(x, y, label = "Gráfico que Liga Todos os Pontos da Reta")
# plotando o gráfico da equação da reta y = ax + b
plt.plot(valoresX, a * valoresX + b,
label = "Reta com os Valores de (a,b) Obtidos pelo Método de Mínimos Quadráticos")
# adicionando uma grade no 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("Gráfico que Liga Todos os Pontos Informados (x,y)")
Text(0.5, 1.0, 'Gráfico que Liga Todos os Pontos Informados (x,y)')
Encontre o Polinômio Quadrático utilizando o método de Mínimos Quadráticos. Leve em consideração os pontos: (2,0), (3,-10), (5,-48) e (6,-76).
Use $y = ax^{2} + bx + c$
Vamos plotar o gráfico com todos os pontos disponíveis:
# coordenada (x,y) da primeira equação
x1, y1 = 2, 0
# coordenada (x,y) da segunda equação
x2, y2 = 3, -10
# coordenada (x,y) da terceira equação
x3, y3 = 5, -48
# coordenada (x,y) da quarta equação
x4, y4 = 6, -76
# lista com todos os valores de x
x = [x1, x2, x3, x4]
# lista com todos os valores de y
y = [y1, y2, y3, y4]
# determinando o tamanho da figura
plt.figure(figsize = (10,5))
# plotando o primeiro ponto (x,y) da primeira equação
plt.scatter(x1, y1, color = "red", label = "Pontos (x,y) Informados")
# plotando o segundo ponto (x,y) da segunda equação
plt.scatter(x2, y2, color = "red")
# plotando o terceiro ponto (x,y) da terceira equação
plt.scatter(x3, y3, color = "red")
# plotando o quarto ponto (x,y) da quarta equação
plt.scatter(x4, y4, color = "red")
# plotando o gráfico que liga todos os pontos informados
plt.plot(x, y, color = "blue", label = "Gráfico que Liga Todos os Pontos (x,y) Informados")
# definindo a legenda no gráfico
plt.legend()
# colocando a grade no gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# colocando o título no gráfico
plt.title("Tentando Encontrar um Polinômio Quadrático por Mínimos Quadráticos")
Text(0.5, 1.0, 'Tentando Encontrar um Polinômio Quadrático por Mínimos Quadráticos')
Vamos definir a matriz ampliada A e a matriz b:
# definindo a matriz ampliada A
A = np.array([[x1 ** 2, x1, 1],
[x2 ** 2, x2, 1],
[x3 ** 2, x3, 1],
[x4 ** 2, x4, 1]])
# definindo a matriz b
b = np.array([[y1],
[y2],
[y3],
[y4]])
# imprimindo a matriz ampliada A
print("A matriz ampliada A é:\n\n", A)
A matriz ampliada A é: [[ 4 2 1] [ 9 3 1] [25 5 1] [36 6 1]]
# imprimindo a matriz b
print("A matriz b é:\n\n", b)
A matriz b é: [[ 0] [-10] [-48] [-76]]
Novamente, vamos utilizar a fórmula para montar a equação geral que interpole todos os pontos dados nas equações do sistema linear:
# definindo a matriz x
x = np.dot(np.dot(np.linalg.pinv(np.dot(A.transpose(), A)), A.transpose()), b)
# definindo as variáveis que serão utilizadas na fórmula geral, que são justamente os elementos de x
(a, b, c) = x[0][0], x[1][0], x[2][0]
# pontos (x,y) da primeira equação
x1, y1 = 2, 0
# pontos (x,y) da segunda equação
x2, y2 = 3, -10
# pontos (x,y) da terceira equação
x3, y3 = 5, -48
# pontos (x,y) da quarta equação
x4, y4 = 6, -76
# lista com todos os valores de x
x = [x1, x2, x3, x4]
# lista com todos os valores de y
y = [y1, y2, y3, y4]
# dimensão da figura
plt.figure(figsize = (10,5))
# plotando os primeiros pontos (x,y) da primeira equação
plt.scatter(x1, y1, color = "red", label = "Pontos (x,y) Informados")
# plotando os segundos pontos (x,y) da segunda equação
plt.scatter(x2, y2, color = "red")
# plotando os terceiros pontos (x,y) da terceira equação
plt.scatter(x3, y3, color = "red")
# plotando os quartos pontos (x,y) da quarta equação
plt.scatter(x4, y4, color = "red")
# plotando o gráfico que liga todos os pontos informados
plt.plot(x, y, color = "blue", label = "Gráfico que Liga Todos os Pontos (x,y) Informados")
# definindo valores para x de 2 até 6
valoresX = np.linspace(2,6)
# plotando o gráfico obtido pelo método de mínimos quadráticos
plt.plot(valoresX, (a * (valoresX ** 2)) + (b * valoresX) + c, color = "Green",
label = "Polinômio Quadrático")
# ativando a legenda no gráfico
plt.legend()
# colocando uma grade no gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# colocando um título no gráfico
plt.title("Tentando Encontrar um Polinômio Quadrático por Mínimos Quadráticos")
Text(0.5, 1.0, 'Tentando Encontrar um Polinômio Quadrático por Mínimos Quadráticos')
Vamos agora operar com gráficos que vão além de retas, observe que o problema de mínimos quadráticos é útil para diversas situações além das mais simples.
Vamos usar a seguinte equação para o gráfico:
E também teremos as seguintes coordenadas:
X | Y |
---|---|
-8 | 10 |
-6 | 1 |
-5 | -4 |
-3 | -3 |
-2 | 0 |
0 | 5 |
1 | 0 |
3 | -4 |
9 | 0 |
12 | 8 |
Cada coordenada nos dará um sistema de equações da forma informada acima. Não nos interessa visualizá-la agora, já que as únicas ferramentas que precisaremos são as coordenadas, a matriz ampliada e a matriz b.
Vamos analisar os pontos informados no gráfico abaixo:
# coordenada (x,y) da primeira equação
x1, y1 = -8, 10
# coordenada (x,y) da segunda equação
x2, y2 = -6, 1
# coordenada (x,y) da terceira equação
x3, y3 = -5, -4
# coordenada (x,y) da quarta equação
x4, y4 = -3, -3
# coordenada (x,y) da quinta equação
x5, y5 = -2, 0
# coordenada (x,y) da sexta equação
x6, y6 = 0, 5
# coordenada (x,y) da sétima equação
x7, y7 = 1, 0
# coordenada (x,y) da oitava equação
x8, y8 = 3, -4
# coordenada (x,y) da nona equação
x9, y9 = 9,0
# coordenada (x,y) da décima equação
x10, y10 = 12, 8
# lista com todos os valores da coordenada x, para plotar o gráfico que une todos os pontos acima
x = [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10]
# lista com todos os valores da coordenada y, para plotar o gráfico que une todos os pontos acima
y = [y1, y2, y3, y4, y5, y6, y7, y8, y9, y10]
# dimensões da figura
plt.figure(figsize = (10,5))
# imprime o primeiro ponto (x,y) informado
plt.scatter(x1, y1, color = "red", label = "Coordenadas (x,y) Informadas")
# imprime o segundo ponto (x,y) informado
plt.scatter(x2, y2, color = "red")
# imprime o terceiro ponto (x,y) informado
plt.scatter(x3, y3, color = "red")
# imprime o quarto ponto (x,y) informado
plt.scatter(x4, y4, color = "red")
# imprime o quinto ponto (x,y) informado
plt.scatter(x5, y5, color = "red")
# imprime o sexto ponto (x,y) informado
plt.scatter(x6, y6, color = "red")
# imprime o sétimo ponto (x,y) informado
plt.scatter(x7, y7, color = "red")
# imprime o oitavo ponto (x,y) informado
plt.scatter(x8, y8, color = "red")
# imprime o nono ponto (x,y) informado
plt.scatter(x9, y9, color = "red")
# imprime o décimo ponto (x,y) informado
plt.scatter(x10, y10, color = "red")
# plota o gráfico que une todos os pontos informados
plt.plot(x, y, color = "blue", label = "Gráfico que Liga Todos os Pontos (x,y) Informados")
# adiciona a legenda ao gráfico
plt.legend()
# adiciona a grade ao gráfico
plt.grid(True)
# reomvendo a moldura do gráfico
plt.box(False)
# adiciona um título ao gráfico
plt.title("Usando Mínimos Quadráticos para Encontrar um Gráfico que Interpola Todos os Pontos Informados")
Text(0.5, 1.0, 'Usando Mínimos Quadráticos para Encontrar um Gráfico que Interpola Todos os Pontos Informados')
Vamos agora definir a matriz ampliada A e a matriz b:
# definindo a matriz ampliada A
A = np.array([[x1 ** 7, x1 ** 6, x1 ** 5, x1 ** 4, x1 ** 3, x1 ** 2, x1, 1],
[x2 ** 7, x2 ** 6, x2 ** 5, x2 ** 4, x2 ** 3, x2 ** 2, x2, 1],
[x3 ** 7, x3 ** 6, x3 ** 5, x3 ** 4, x3 ** 3, x3 ** 2, x3, 1],
[x4 ** 7, x4 ** 6, x4 ** 5, x4 ** 4, x4 ** 3, x4 ** 2, x4, 1],
[x5 ** 7, x5 ** 6, x5 ** 5, x5 ** 4, x5 ** 3, x5 ** 2, x5, 1],
[x6 ** 7, x6 ** 6, x6 ** 5, x6 ** 4, x6 ** 3, x6 ** 2, x6, 1],
[x7 ** 7, x7 ** 6, x7 ** 5, x7 ** 4, x7 ** 3, x7 ** 2, x7, 1],
[x8 ** 7, x8 ** 6, x8 ** 5, x8 ** 4, x8 ** 3, x8 ** 2, x8, 1],
[x9 ** 7, x9 ** 6, x9 ** 5, x9 ** 4, x9 ** 3, x9 ** 2, x9, 1],
[x10 ** 7, x10 ** 6, x10 ** 5, x10 ** 4, x10 ** 3, x10 ** 2, x10, 1]])
# definindo a matriz B
b = np.array([[10],
[1],
[-4],
[-3],
[0],
[5],
[0],
[-4],
[0],
[8]])
# imprimindo a matriz ampliada A
print("A matriz ampliada A é:\n\n", A)
A matriz ampliada A é: [[-2097152 262144 -32768 4096 -512 64 -8 1] [ -279936 46656 -7776 1296 -216 36 -6 1] [ -78125 15625 -3125 625 -125 25 -5 1] [ -2187 729 -243 81 -27 9 -3 1] [ -128 64 -32 16 -8 4 -2 1] [ 0 0 0 0 0 0 0 1] [ 1 1 1 1 1 1 1 1] [ 2187 729 243 81 27 9 3 1] [ 4782969 531441 59049 6561 729 81 9 1] [35831808 2985984 248832 20736 1728 144 12 1]]
# imprimindo a matriz b
print("A matriz b é:\n\n", b)
A matriz b é: [[10] [ 1] [-4] [-3] [ 0] [ 5] [ 0] [-4] [ 0] [ 8]]
Vamos, novamente, usar a fórmula abaixo para descobrir o vetor x:
que se resume em:
# definindo o vetor x
x = np.dot(np.dot(np.linalg.pinv(np.dot(A.transpose(), A)), A.transpose()), b)
# imprimindo o vetor x
print("O vetor x é:\n\n", x)
O vetor x é: [[-2.54270961e-07] [ 2.20663543e-06] [-2.58033316e-05] [ 2.00174098e-04] [-2.12060570e-03] [ 1.59452682e-02] [ 4.25160498e-01] [ 1.13480943e+00]]
Desse modo, podemos construir o gráfico abaixo:
# definindo as variáveis da equação geral
(a, b, c, d, e, f, g, h) = x[0][0], x[1][0], x[2][0], x[3][0], x[4][0], x[5][0], x[6][0], x[7][0]
# coordenada (x,y) da primeira equação
x1, y1 = -8, 10
# coordenada (x,y) da segunda equação
x2, y2 = -6, 1
# coordenada (x,y) da terceira equação
x3, y3 = -5, -4
# coordenada (x,y) da quarta equação
x4, y4 = -3, -3
# coordenada (x,y) da quinta equação
x5, y5 = -2, 0
# coordenada (x,y) da sexta equação
x6, y6 = 0, 5
# coordenada (x,y) da sétima equação
x7, y7 = 1, 0
# coordenada (x,y) da oitava equação
x8, y8 = 3, -4
# coordenada (x,y) da nona equação
x9, y9 = 9,0
# coordenada (x,y) da décima equação
x10, y10 = 12, 8
# lista com todos os valores da coordenada x, para plotar o gráfico que une todos os pontos acima
x = [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10]
# lista com todos os valores da coordenada y, para plotar o gráfico que une todos os pontos acima
y = [y1, y2, y3, y4, y5, y6, y7, y8, y9, y10]
# dimensões da figura
plt.figure(figsize = (10,5))
# imprime o primeiro ponto (x,y) informado
plt.scatter(x1, y1, color = "red", label = "Coordenada (x,y) Informadas")
# imprime o segundo ponto (x,y) informado
plt.scatter(x2, y2, color = "red")
# imprime o terceiro ponto (x,y) informado
plt.scatter(x3, y3, color = "red")
# imprime o quarto ponto (x,y) informado
plt.scatter(x4, y4, color = "red")
# imprime o quinto ponto (x,y) informado
plt.scatter(x5, y5, color = "red")
# imprime o sexto ponto (x,y) informado
plt.scatter(x6, y6, color = "red")
# imprime o sétimo ponto (x,y) informado
plt.scatter(x7, y7, color = "red")
# imprime o oitavo ponto (x,y) informado
plt.scatter(x8, y8, color = "red")
# imprime o nono ponto (x,y) informado
plt.scatter(x9, y9, color = "red")
# imprime o décimo ponto (x,y) informado
plt.scatter(x10, y10, color = "red")
# plota o gráfico que une todos os pontos informados
plt.plot(x, y, color = "blue", label = "Gráfico que Liga Todos os Pontos (x,y) Informados")
# definindo valores para x entre -8 e 13, para ser usada no gráfico
valoresX = np.linspace(-8,12)
# plotando o gráfico construido a partir dos métodos de mínimo quadrático
plt.plot(valoresX, (a * (valoresX ** 7)) + (b * (valoresX ** 6)) + (c * (valoresX ** 5)) +
(d * (valoresX ** 4)) + (e * (valoresX ** 3)) + (f * (valoresX ** 2)) + (g * valoresX) + h,
color = "brown", label = "Gráfico que Interpola os Pontos (x,y) Informados")
# adiciona a legenda ao gráfico
plt.legend()
# adiciona a grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# adiciona um título ao gráfico
plt.title("Usando Mínimos Quadráticos para Encontrar um Gráfico que Interpola Todos os Pontos Informados")
Text(0.5, 1.0, 'Usando Mínimos Quadráticos para Encontrar um Gráfico que Interpola Todos os Pontos Informados')
Encontre o polinômio cúbico utilizando o método de mínimos quadráticos, use os pontos (-1,-14), (0,-5), (1,-4), (2,1) e (3,22).
Use $y = ax^{3} + bx^{2} + cx + d$
Vamos plotar todos os pontos informados:
# coordenada (x,y) da primeira equação
x1, y1 = -1, -14
# coordenada (x,y) da segunda equação
x2, y2 = 0, -5
# coordenada (x,y) da terceira equação
x3, y3 = 1, -4
# coordenada (x,y) da quarta equação
x4, y4 = 2, 1
# coordenada (x,y) da quinta equação
x5, y5 = 3, 22
# lista com todos os valores de x
x = [x1, x2, x3, x4, x5]
# lista com todos os valores de y
y = [y1, y2, y3, y4, y5]
# definindo a dimensão da figura
plt.figure(figsize = (10, 5))
# plotando o primeiro ponto (x,y) da primeira equação
plt.scatter(x1, y1, color = "red", label = "Pontos (x,y) Informados")
# plotando o segundo ponto (x,y) da segunda equação
plt.scatter(x2, y2, color = "red")
# plotando o terceiro ponto (x,y) da terceira equação
plt.scatter(x3, y3, color = "red")
# plotando o quarto ponto (x,y) da quarta equação
plt.scatter(x4, y4, color = "red")
# plotando o quinto ponto (x,y) da quinta equação
plt.scatter(x5, y5, color = "red")
# plotando o gráfico que liga todos os pontos informados
plt.plot(x, y, color = "blue", label = "Gráfico que Liga Todos os Pontos (x, y)")
# colocando uma grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# colocando a legenda no gráfico
plt.legend()
# removendo o título do gráfico
plt.title("Tentando Encontrar um Polinômio Cúbico por Mínimos Quadráticos")
Text(0.5, 1.0, 'Tentando Encontrar um Polinômio Cúbico por Mínimos Quadráticos')
Vamos definir a matriz ampliada A e a matriz b.
# definindo a matriz ampliada A
A = np.array([[x1 ** 3, x1 ** 2, x1, 1],
[x2 ** 3, x2 ** 2, x2, 1],
[x3 ** 3, x3 ** 2, x3, 1],
[x4 ** 3, x4 ** 2, x4, 1],
[x5 ** 3, x5 ** 2, x5, 1]])
# definindo a matriz b
b = np.array([[y1],
[y2],
[y3],
[y4],
[y5]])
# imprimindo a matriz ampliada A
print("A matriz ampliada A é:\n\n", A)
A matriz ampliada A é: [[-1 1 -1 1] [ 0 0 0 1] [ 1 1 1 1] [ 8 4 2 1] [27 9 3 1]]
# imprimindo a matriz b
print("A matriz b é:\n\n", b)
A matriz b é: [[-14] [ -5] [ -4] [ 1] [ 22]]
Como é de praxe, usaremos a fórmula $x = (A^{T}A)^{-1}A^{T}b$ para encontrar as variáveis que compõem a equação geral com base em todas as equações do sistema linear.
# definindo o vetor x
x = np.dot(np.dot(np.linalg.pinv(np.dot(A.transpose(), A)), A.transpose()), b)
# imprimindo o vetor x
print("O vetor x é:\n\n", x)
O vetor x é: [[ 2.] [-4.] [ 3.] [-5.]]
# pegando os elementos de x, que são as coordenadas da equação geral
(a, b, c, d) = x[0][0], x[1][0], x[2][0], x[3][0]
# imprimindo a equação geral
print("A equação geral é: y = {}x³ {}x² + {}x {}".format(int(a), int(b), int(c), int(d)))
A equação geral é: y = 2x³ -4x² + 2x -4
Por fim, teremos o gráfico:
# coordenada (x,y) da primeira equação
x1, y1 = -1, -14
# coordenada (x,y) da segunda equação
x2, y2 = 0, -5
# coordenada (x,y) da terceira equação
x3, y3 = 1, -4
# coordenada (x,y) da quarta equação
x4, y4 = 2, 1
# coordenada (x,y) da quinta equação
x5, y5 = 3, 22
# lista com todos os valores de x
x = [x1, x2, x3, x4, x5]
# lista com todos os valores de y
y = [y1, y2, y3, y4, y5]
# definindo a dimensão da figura
plt.figure(figsize = (10, 5))
# plotando o primeiro ponto (x,y) da primeira equação
plt.scatter(x1, y1, color = "red", label = "Pontos (x,y) Informados")
# plotando o segundo ponto (x,y) da segunda equação
plt.scatter(x2, y2, color = "red")
# plotando o terceiro ponto (x,y) da terceira equação
plt.scatter(x3, y3, color = "red")
# plotando o quarta ponto (x,y) da quarta equação
plt.scatter(x4, y4, color = "red")
# plotando o quinto ponto (x,y) da quinta equação
plt.scatter(x5, y5, color = "red")
# plotando o gráfico que liga todos os pontos informados
plt.plot(x, y, color = "blue", label = "Gráfico que Liga Todos os Pontos (x, y)")
# definindo valores de x entre -1 e 3
valoresX = np.linspace(-1, 3)
# plotando a equação geral obtida pelo método de mínimos quadráticos
plt.plot(valoresX, (a * (valoresX ** 3)) + (b * (valoresX ** 2)) + (c * valoresX) + d)
# adicionando uma grade ao gráfico
plt.grid(True)
# removendo a moldura do gráfico
plt.box(False)
# adicionando uma legenda ao gráfico
plt.legend()
# adicionando um título ao gráfico
plt.title("Tentando Encontrar um Polinômio Cúbico por Mínimos Quadráticos")
Text(0.5, 1.0, 'Tentando Encontrar um Polinômio Cúbico por Mínimos Quadráticos')
Pensando computacionalmente, a ideia desses algoritmos é encontrar um modelo matemático que mais se aproxime dos dados disponíveis. Desse modo, esses modelos podem ser usados em algoritmos de Machine Learning (um ramo da inteligência artificial) para fazer predições por regressão. Vale a pena a pesquisa sobre o tema!