Escreva um programa que leia o arquivo dados_ajuste.dat contendo valores de
e
e ajuste uma função linear a esses dados usando o método de mínimos quadrados.
Passo 1
O enunciado pede para escrever um programa que leia um arquivo chamado dados_ajuste.dat contendo em cada linha um par de valores
e ajuste uma reta do tipo
a esses pontos usando o método dos mínimos quadrados. Vamos precisar da teoria de regressão linear simples, que fornece fórmulas fechadas para o coeficiente angular
e o coeficiente linear
.
Passo 2
Na regressão linear simples, dados
pontos
, definimos as somas
Então o coeficiente angular
e o coeficiente linear
são dados por
Passo 3
O algoritmo do programa será:
- Abrir o arquivo dados_ajuste.dat em modo leitura.
- Inicializar contadores:
, , , , . - Para cada linha do arquivo:
- Fazer o parsing dos dois números reais
e . - Incrementar
. - Atualizar
- Fazer o parsing dos dois números reais
- Fechar o arquivo.
Passo 4
Depois de computar as somas e
, aplicar diretamente as fórmulas
e exibir os valores de
e
. Se o denominador em
for zero, deve-se tratar como caso degenerado (por exemplo, exibindo uma mensagem de erro).
Resposta
# Programa de ajuste linear por mínimos quadrados
# Lê o arquivo 'dados_ajuste.dat' e calcula m e b para y = m*x + b
def main():
nome_arquivo = 'dados_ajuste.dat'
try:
with open(nome_arquivo, 'r') as arquivo:
N = 0
Sx = Sy = Sxx = Sxy = 0.0
for linha in arquivo:
linha = linha.strip()
if not linha or linha.startswith('#'):
continue # pula linhas vazias ou comentários
x_str, y_str = linha.split()
x = float(x_str)
y = float(y_str)
N += 1
Sx += x
Sy += y
Sxx += x*x
Sxy += x*y
if N == 0:
print("Arquivo vazio ou sem dados válidos.")
return
denom = N*Sxx - Sx*Sx
if abs(denom) < 1e-12:
print("Erro: denominador zero no cálculo de m (pontos verticais ou todos x iguais).")
return
m = (N*Sxy - Sx*Sy) / denom
b = (Sy - m*Sx) / N
print(f"Ajuste linear: y = {m:.6f} x + {b:.6f}")
except FileNotFoundError:
print(f"Arquivo '{nome_arquivo}' não encontrado.")
except ValueError:
print("Formato de dado inválido. Cada linha deve ter dois números reais.")
if __name__ == '__main__':
main()