0% acharam este documento útil (0 voto)
15 visualizações9 páginas

Análise de Tendências de CO2 com Python

Enviado por

Ana Clara
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
15 visualizações9 páginas

Análise de Tendências de CO2 com Python

Enviado por

Ana Clara
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

#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] ()

Você também pode gostar