import numpy as np
import matplotlib.pyplot as plt
from lagrange import maxminv

#Exercício 1:  Movimento de um pêndulo simples

L = 1 #m
theta = 0 #rad
g = 9.8 #m/s^2

def acelera_pendulo(theta, L, g):
    # Aceleração do pêndulo
    a = -g / L * np.sin(theta)
    return a



# a) Simule o movimento do pêndulo usando o método de Euler-Cromer durante 10s.

theta0 = 0.1
v0 = 0

t0 = 0
tf = 10
dt = 0.01
n = int((tf - t0) / dt)
t = np.linspace(t0, tf, n)


def euler_cromer(theta, v, acelera, L, g, dt):
    # Calcula a aceleração
    a = acelera(theta, L, g)
    
    # Atualiza a velocidade
    v += a * dt
    
    # Atualiza o ângulo
    theta += v * dt
    
    return theta, v


# Inicializa os arrays para armazenar os resultados
theta_values = np.zeros(n)
v_values = np.zeros(n)
theta_values[0] = theta0
v_values[0] = v0

for i in range(1, n):
    theta_values[i], v_values[i] = euler_cromer(theta_values[i-1], v_values[i-1], acelera_pendulo, L, g, dt)



############### 
maximos_tempos = []

for i in range(1, n-1):
    if theta_values[i-1] < theta_values[i] and theta_values[i] > theta_values[i+1]:
        # Três pontos em torno do máximo local
        xm1, xm2, xm3 = t[i-1], t[i], t[i+1]
        ym1, ym2, ym3 = theta_values[i-1], theta_values[i], theta_values[i+1]

        t_max, _ = maxminv(xm1, xm2, xm3, ym1, ym2, ym3)
        maximos_tempos.append(t_max)

# Verifica se encontrou pelo menos dois máximos
if len(maximos_tempos) >= 2:
    T_medido = maximos_tempos[1] - maximos_tempos[0]
    T_teorico = 2 * np.pi * np.sqrt(L / g)

    print(f"Período medido: {T_medido:.4f} s")
    print(f"Período teórico: {T_teorico:.4f} s")
    print(f"Erro relativo: {abs(T_medido - T_teorico)/T_teorico * 100:.2f}%")
else:
    print("Não foram encontrados dois máximos para calcular o período.")