#GRUPO 3 - CALCULO NÚMERICO - TURMA T01
#DISCENTES - Ana Clara // Lucas Perdigão
import numpy as np
import [Link] as plt
# [Link] da biblioteca NumPy permite ler dados de arquivos de texto e
armazená-los em um array assim ele
# Carrega os dados do arquivo co2_mm_mlo.txt, do link:
extracao =
[Link]('[Link]
# Extrai as colunas de data, coluna 0 são os anos, coluna os meses e CO2 esta na
coluna 4, ficando portanto definida;
x = extracao[:, 0] + extracao[:, 1]/12
y = extracao[:, 4]
# equação (2)
def linear(x, a, b):
return a * x + b
#equação (9)
def log(x, b, a):
return a + b * [Link](x)
#equação (10)
def potencial(x, b, a):
return a * x**b
#equação (12)
def exponencial(x, a, b):
return a * [Link](b * x)
#equação (14)
def quadratica(x, a, b, c):
return a * x**2 + b * x + c
#equação (42)
def geometrica(x, a, b):
return a * (b ** x)
# menu de escolha
print("Escolha uma das opções:")
print("1. Linear")
print("2. Logarítmica")
print("3. Potência")
print("4. Exponencial")
print("5. Quadrática")
print("6. Geometrica")
escolha = int(input("Digite sua escolha (1-6): "))
if escolha == 1:
# imprimir tabela de valores x e y, onde x vai ser as datas somada, ano com mês
print("x\t y")
for i in range(len(x)):
print(f"{x[i]}\t {y[i]}")
n = len ( x )
sum_x = [Link] ( x )
sum_y = [Link] ( y )
sum_xy = [Link] ( [x[i] * y[i] for i in range ( n )] )
sum_x_ao_quadrado = [Link] ( [x[i] ** 2 for i in range ( n )] )
# pelas formulas (3) e (4) do relatorio
b = (n * sum_xy - sum_x * sum_y) / (n * sum_x_ao_quadrado - sum_x ** 2)
a = (sum_y - b * sum_x) / n
y_xi = [b * x[i] + a for i in range ( n )]
residuos = [y[i] - y_xi[i] for i in range ( n )] # resíduos de cada observação
MinE = sum ( [r ** 2 for r in residuos] ) # soma dos quadrados dos resíduos
y_barra = [Link](y)/n
SQreg = [Link]((y_xi - y_barra)**2)
SQtot = [Link]((y - y_barra)**2)
R2 = SQreg/SQtot
print ( f"A equação da reta ajustada é y = {b:.6f}x + {a:.6f}" )
print ( f"A soma dos quadrados dos resíduos é {MinE:.4f}" )
print ( f"O coeficiente de determinação R² é {R2:.8f}" )
print ( f'a = {a:.6f}' )
print ( f'b = {b:.6f}' )
print ( f'y_barra = {y_barra:.6f}' )
print ( f'SQreg = {SQreg:.6f}' )
print ( f'SQtot = {SQtot:.6f}' )
# Estimação de valores
x_est = float ( input ( "Digite o valor estimado para x: " ) )
# Mostrar a equação linear e o valor correspondente de y para x digitado
y_est = a + b * x_est
print ( f' o valor estimado de f(x)= y = {a:.5f} + {b:.5f}x' )
print ( f'O valor de y para x = {x_est} é y = {y_est:.5f}' )
#grafico
[Link] ( x, y, 'o', label='Pontos de x' )
[Link] ( x, linear ( x, b, a ), label='Linha de tendência linear' )
[Link] ( x_est, y_est, label='Valor estimado', color='red' )
[Link] ( 'Ano' )
[Link] ( 'CO2 (ppm)' )
[Link] ( 'Concentração de CO2 na atmosfera' )
[Link] ()
[Link] ()
elif escolha == 2:
# imprimir tabela de valores x e y, onde x vai ser as datas somada, ano com mês
print("x\t y")
for i in range(len(x)):
print(f"{x[i]}\t {y[i]}")
# afim de encontrar os valores a e b faz-se o somatório, com adicional do log
aonde for necessario, no caso da (9) em x
n = len ( x )
sum_x = [Link] ( [Link] ( x ) )
sum_y = [Link] ( y )
sum_xy = [Link] ( [[Link] ( x[i] ) * y[i] for i in range ( n )] )
sum_x_ao_quadrado = [Link] ( [[Link] ( x[i] ) ** 2 for i in range ( n )] )
# pelas fórmulas (3) e (4) do relatório aplicando log (a) por causa da formula
(11)
b = (n * sum_xy - sum_x * sum_y) / (n * sum_x_ao_quadrado - sum_x ** 2)
a = (sum_y - b * sum_x) / n
# para método dos mínimos quadrados usamos a equação (7) onde primeiro
precisamos determinar Y(xi) da equação
# que seria substituir cada x na equação (9), depois yi, que é cada coordenada
y, e chamo a diferença deles de
# resíduos, e então faço somatório deles ao quadrado para nos dar o minE da
equação (7)
y_xi = [b * [Link] ( x[i] ) + a for i in range ( n )]
residuos = [y[i] - y_xi[i] for i in range ( n )] # resíduos de cada observação
MinE = [Link] ( [r ** 2 for r in residuos] ) # soma dos quadrados dos resíduos
# para o calculo do R², pela equação (18), precisamos definir o SQREG (15) e
SQTOT (16) e para o calculo dos dois
# neles tem o calculo do Y barra (17), ficando entao:
y_barra = [Link] ( y ) / n
SQreg = [Link] ( (y_xi - y_barra) ** 2 )
SQtot = [Link] ( (y - y_barra) ** 2 )
R2 = SQreg / SQtot
print ( f"A equação da reta ajustada é y = {a:.6f} + {b:.6f}ln(x)" )
print ( f"A soma dos quadrados dos resíduos é {MinE:.6f}" )
print ( f"O coeficiente de determinação R² é {R2:.6f}" )
print ( f'a = {a:.6f}' )
print ( f'b = {b:.6f}' )
print ( f'y_barra = {y_barra:.6f}' )
print ( f'SQreg = {SQreg:.6f}' )
print ( f'SQtot = {SQtot:.6f}' )
# Estimação de valores
x_est = float ( input ( "Digite o valor estimado para x: " ) )
# Mostrar a equação linear e o valor correspondente de y para x digitado
y_est = a + b * [Link] ( x_est )
print ( f' o valor estimado de f(x)= y = {a:.6f} + {b:.6f}lnx' )
print ( f'O valor de y para x = {x_est} é y = {y_est:.6f}' )
# partes da configuração do gráfico
[Link] ( x, y, 'o', label='Pontos de x' )
[Link] ( x, log( x, b, a ), label='Linha de tendência logarítmica' )
[Link] ( x_est, y_est, label='Valor estimado', color='red' )
[Link] ( 'Ano' )
[Link] ( 'CO2 (ppm)' )
[Link] ( 'Concentração de CO2 na atmosfera' )
[Link] ()
[Link] ()
elif escolha == 3:
# imprimir tabela de valores x e y, onde x vai ser as datas somada, ano com mês
print("x\t y")
for i in range(len(x)):
print(f"{x[i]}\t {y[i]}")
log_x = [Link] ( x )
log_y = [Link] ( y )
# afim de encontrar os valores a e b faz-se o somatório
n = len ( log_x )
sum_log_x = [Link] ( log_x )
sum_log_y = [Link] ( log_y )
sum_log_x_log_y = [Link] ( log_x * log_y )
sum_log_x_ao_quadrado = [Link] ( log_x ** 2 )
# pelas fórmulas (3) e (4) do relatório
# a vai ser dado como log de a, entao para tirar aplica o exponencial
b = (n * sum_log_x_log_y - sum_log_x * sum_log_y) / (n * sum_log_x_ao_quadrado
- sum_log_x ** 2)
a = [Link] ( (sum_log_y - b * sum_log_x) / n )
# para método dos mínimos quadrados usamos a equação (7) onde primeiro
precisamos determinar Y(xi) da equação
# que seria substituir cada x na equação (2), depois yi, que é cada coordenada
y, e chamo a diferença deles de
# resíduos, e então faço somatório deles ao quadrado para nos dar o minE da
equação (7)
y_xi = [a * (xi ** b) for xi in x]
residuos = [y[i] - y_xi[i] for i in range ( n )] # resíduos de cada observação
minE = [Link] ( [r ** 2 for r in residuos] ) # soma dos quadrados dos resíduos
# para o calculo do R², pela equação (18), precisamos definir o SQREG (15) e
SQTOT (16) e para o calculo dos dois
# neles tem o calculo do Y barra (17), ficando entao:
y_barra = [Link] ( log_y ) / n
SQreg = [Link] ( (y_xi - y_barra) ** 2 )
SQtot = [Link] ( (y - y_barra) ** 2 )
R2 = SQreg / SQtot
print ( f"A equação da linha de tendência de potência é y = {a:.6f}x^{b:.6f}" )
print ( f"A soma dos quadrados dos resíduos é {minE:.6f}" )
print ( f"O coeficiente de determinação R² é {R2:.6f}" )
print ( f'a = {a:.30f}' )
print ( f'b = {b:.6f}' )
print ( f'y_barra = {y_barra:.6f}' )
print ( f'SQreg = {SQreg:.6f}' )
print ( f'SQtot = {SQtot:.6f}' )
# Estimação de valores
x_est = float ( input ( "Digite o valor estimado para x: " ) )
# Mostrar a equação linear e o valor correspondente de y para x digitado
y_est = a * x_est ** b
print ( f' o valor estimado de f(x)= y = {a:.5f} + {b:.5f}lnx' )
print ( f'O valor de y para x = {x_est} é y = {y_est:.5f}' )
# partes da configuração do gráfico
[Link] ( x, y, 'o', label='Pontos de x' )
[Link] ( x, potencial(x, b, a), label='Linha de tendência de potência' )
[Link] ( x_est, y_est, label='Valor estimado', color='red' )
[Link] ( 'Ano' )
[Link] ( 'CO2 (ppm)' )
[Link] ( 'Concentração de CO2 na atmosfera' )
[Link] ()
[Link] ()
elif escolha == 4:
# imprimir tabela de valores x e y, onde x vai ser as datas somada, ano com mês
print("x\t y")
for i in range(len(x)):
print(f"{x[i]}\t {y[i]}")
# Aplicando o logaritmo natural nos dados, da equação (13)
ln_y = [Link] ( y )
# Ajustando a regressão linear nos dados transformados
n = len ( x )
sum_x = [Link] ( x )
sum_ln_y = [Link] ( ln_y )
sum_x_ln_y = [Link] ( x * ln_y )
sum_x_ao_quadrado = [Link] ( x ** 2 )
# por causa da equação (13) a vai vim em forma de ln, para tirar aplica-se
expoenencial dos dois lados
b = (n * sum_x_ln_y - sum_x * sum_ln_y) / (n * sum_x_ao_quadrado - sum_x ** 2)
a = [Link] ( (sum_ln_y - b * sum_x) / n )
# para método dos mínimos quadrados usamos a equação (7) onde primeiro
precisamos determinar Y(xi) da equação
# que seria substituir cada x na equação (12), depois yi, que é cada coordenada
y, e chamo a diferença deles de
# no caso apenas chamamos a funcão exponencial, para calcular cada valor para
y(xi)
# residuos, e então faço somatorio deles ao quadrado para nos dar o minE da
equação (7)
y_xi = exponencial ( x, a, b )
residuos = (y - y_xi)
MinE = [Link] ( residuos ** 2 ) # soma dos quadrados dos resíduos
# para o calculo do R², pela equação (18), precisamos definir o SQREG (15) e
SQTOT (16) e para o calculo dos dois
# neles tem o calculo do Y barra (17), ficando entao:
y_barra = [Link] ( ln_y ) / n
SQreg = [Link] ( (y_xi - y_barra) ** 2 )
SQtot = [Link] ( (y - y_barra) ** 2 )
R2 = SQreg / SQtot
# Imprimindo os resultados
print ( f"A equação da curva ajustada é y = {a:.6f} * e^({b:.6f}x)" )
print ( f"A soma dos quadrados dos resíduos é {MinE:.6f}" )
print ( f"O coeficiente de determinação R² é {R2:.6f}" )
print ( f'a = {a:.6f}' )
print ( f'b = {b:.6f}' )
print ( f'y_barra = {y_barra:.6f}' )
print ( f'SQreg = {SQreg:.6f}' )
print ( f'SQtot = {SQtot:.6f}' )
# Estimação de valores
x_est = float ( input ( "Digite o valor estimado para x: " ) )
# Mostrar a equação linear e o valor correspondente de y para x digitado
y_est = a * [Link] ( b * x_est )
print ( f' o valor estimado de f(x)= y = {a:.6f} * e^{b:.6f}x' )
print ( f' O valor de y para x = {x_est} é y = {y_est:.6f}' )
# Configurando o gráfico
[Link] ( x, y, 'o', label='Dados de entrada' )
[Link] ( x, exponencial ( x, a, b ), label='Curva de tendência exponencial' )
[Link] ( x_est, y_est, label='Valor estimado', color='red' )
[Link] ( 'Ano' )
[Link] ( 'CO2 (ppm)' )
[Link] ( 'Concentração de CO2 na atmosfera' )
[Link] ()
[Link] ()
elif escolha == 5:
# imprimir tabela de valores x e y, onde x vai ser as datas somada, ano com mês
print("x\t y")
for i in range(len(x)):
print(f"{x[i]}\t {y[i]}")
# começa eliminação de Gauss para obter a, b e c, os coeficientes
indeterminados
def Gauss(A, b):
n = len ( A )
# Executa a eliminação de Gauss
for i in range ( n ):
# Encontra o pivô
pivo = A[i][i]
if abs ( pivo ) < 1e-8:
raise ValueError ( "A matriz não tem solução única." )
# Divide a linha pelo pivô
A[i] /= pivo
b[i] /= pivo
# Elimina a coluna i das demais linhas
for j in range ( n ):
if i == j:
continue
fator = A[j][i]
A[j] -= fator * A[i]
b[j] -= fator * b[i]
# Retorna a solução
return b
# Monta o sistema de equações lineares
A = [Link] ((3, 3))
A[0][0] = [Link]((x ** 4))
A[0][1] = [Link]((x ** 3))
A[0][2] = [Link]((x ** 2))
A[1][0] = [Link]((x ** 3))
A[1][1] = [Link]((x ** 2))
A[1][2] = [Link]((x))
A[2][0] = [Link]((x ** 2))
A[2][1] = [Link]((x))
A[2][2] = [Link](len (x))
b = [Link] ( 3 )
b[0] = [Link]((x ** 2 * y))
b[1] = [Link]((x * y))
b[2] = [Link]((y))
# Imprime a matriz A e o vetor b
print ( "Matriz A:" )
print ( A )
print ( "Vetor b:" )
print ( b )
# Resolve o sistema linear
coef = Gauss ( A, b )
# Imprime os coeficientes encontrados
a, b, c = coef
print ( f"Coeficientes encontrados: a = {a:.6f}, b = {b:.6f}, c = {c:.6f}" )
# começa resolver para a linha de tendencia polinomial de 2º grau
def func_polinomial2(x, a, b, c):
return a * x ** 2 + b * x + c
# para método dos mínimos quadrados usamos a equação (7) onde primeiro
precisamos determinar Y(xi) da equação
# que seria substituir cada x na equação (14), depois yi, que é cada coordenada
y, e chamo a diferença deles de
# resíduos, e então faço somatório deles ao quadrado para nos dar o minE da
equação (7)
n = len ( x )
y_xi = [func_polinomial2 ( xi, a, b, c ) for xi in x]
residuos = [y[i] - y_xi[i] for i in range ( n )] # resíduos de cada observação
MinE = [Link] ( [r ** 2 for r in residuos] ) # soma dos quadrados dos resíduos
# para o calculo do R², pela equação (18), precisamos definir o SQREG (15) e
SQTOT (16) e para o calculo dos dois
# neles tem o calculo do Y barra (17), ficando entao:
y_barra = [Link] ( y ) / len ( x )
SQreg = [Link] ( (y_xi - y_barra) ** 2 )
SQtot = [Link] ( (y - y_barra) ** 2 )
R2 = SQreg / SQtot
print ( f"A equação da linha de tendência polinomial de 2º grau é y =
{a:.6f}x^2 + {b:.6f}x + {c:.6f}" )
print ( f"A soma dos quadrados dos resíduos é {MinE:.6f}" )
print ( f"O coeficiente de determinação R² é {R2:.6f}" )
print ( f'a = {a:.6f}' )
print ( f'b = {b:.6f}' )
print ( f'c = {c:.6f}' )
print ( f'y_barra = {y_barra:.6f}' )
print ( f'SQreg = {SQreg:.6f}' )
print ( f'SQtot = {SQtot:.6f}' )
# Estimação de valores
x_est = float ( input ( "Digite o valor estimado para x: " ) )
# Mostrar a equação do polinômio de grau 2 e o valor correspondente de y para x
digitado
y_est = a * x_est ** 2 + b * x_est + c
print ( f'A equação do polinômio de grau 2 é y = {a:.6f}x² + {b:.6f}x +
{c:.6f}' )
print ( f'O valor de y para x = {x_est} é y = {y_est:.6f}' )
# Mostra o gráfico
[Link] ( x, y, 'o', label='Pontos de x' )
[Link] ( x, func_polinomial2 ( x, a, b, c ), label='linha de tendencia
polinomial' )
[Link] ( x_est, y_est, label='Valor estimado', color='red' )
[Link] ( 'Ano' )
[Link] ( 'CO2 (ppm)' )
[Link] ( 'Concentração de CO2 na atmosfera' )
[Link] ()
[Link] ()
elif escolha == 6:
# imprimir tabela de valores x e y, onde x vai ser as datas somada, ano com mês
print("x\t y")
for i in range(len(x)):
print(f"{x[i]}\t {y[i]}")
# afim de encontrar os valores a e b faz-se o somatorio a*x^b => log y = log a
+ b log x ;com exp => a*x^b
log_y = [Link] ( y )
n = len ( x )
sum_x = [Link] ( x )
sum_log_y = [Link] ( log_y )
sum_xy = [Link] ( [x[i] * log_y[i] for i in range ( n )] )
sum_x_ao_quadrado = [Link]([x[i] ** 2 for i in range(n)])
# pelas formulas (3) e (4) do relatorio
# log y = log a + b log x aplica EXPOENTE para isolar a
b = (n * sum_xy - sum_x * sum_log_y) / (n * sum_x_ao_quadrado - sum_x ** 2)
a = ((sum_log_y - b * sum_x) / n)
b = [Link](b)
a = [Link](a)
# para método dos mínimos quadrados usamos a equação (7) onde primeiro
precisamos determinar Y(xi) da equação
# que seria substituir cada x na equação (2), depois yi, que é cada coordenada
y, e chamo a diferença deles de
# residuos, e então faço somatorio deles ao quadrado para nos dar o minE da
equação (7)
y_xi = geometrica(x, a, b )
residuos = [y[i] - y_xi[i] for i in range(n)] # resíduos de cada observação
MinE = [Link]([r ** 2 for r in residuos]) # soma dos quadrados dos resíduos
# para o calculo do R², pela equação (18), precisamos definir o SQREG (15) e
SQTOT (16) e para o calculo dos dois
# neles tem o calculo do Y barra (17), ficando entao:
y_barra = sum_log_y / n
SQreg = [Link]((y_xi - y_barra) ** 2 )
SQtot = [Link]((y - y_barra) ** 2 )
R2 = SQreg / SQtot
print ( f"A equação da reta ajustada é y = {a:.30f} * {b:.6f}^x" )
print ( f"A soma dos quadrados dos resíduos é {MinE:.6f}" )
print ( f"O coeficiente de determinação R² é {R2:.9f}" )
print ( f'a = {a:.6f}' )
print ( f'b = {b:.6f}' )
print ( f'y_barra = {y_barra:.6f}' )
print ( f'SQreg = {SQreg:.6f}' )
print ( f'SQtot = {SQtot:.6f}' )
# Estimação de valores
x_est = float ( input ( "Digite o valor estimado para x: " ) )
# Mostrar a equação linear e o valor correspondente de y para x digitado
y_est = a * b ** x_est
print(f' o valor estimado de f(x)= y = {a:.6f} * {b:.6f}^x')
print(f'O valor de y para x = {x_est} é y = {y_est:.6f}')
# partes da configuração do gráfico
[Link] ( x, y, 'o', label='Pontos de x' )
[Link] ( x, geometrica ( x, a, b ), label='Linha de tendência geometrica' )
[Link] ( x_est, y_est, label='Valor estimado', color='red' )
[Link] ( 'Ano' )
[Link] ( 'CO2 (ppm)' )
[Link] ( 'Concentração de CO2 na atmosfera' )
[Link] ()
[Link] ()