import sympy as sy
import numpy as np
import matplotlib.pyplot as plt

# Exercício 1 – Bola numa pista inclinada (simulação com método de Euler-Cromer)

#a) Faça uma simulação do movimento da bola usando o método de Euler-Cromer

g = 9.81  # aceleração gravitacional (m/s²)
m = 1.0   # massa arbitrária (para energia)
dt = 0.001  # passo de tempo (s)
x_max = 2.5  # posição final


x0 = 0.0
v0 = 0.0

def aceleracao_ex1(x, g):
    return 0.05 * g if x < 2.0 else 0.0

def simulacao_euler_cromer(aceleracao_func, x0, v0, x_lim, dt):
    x = x0
    v = v0
    t = 0.0

    x_vals = [x]
    v_vals = [v]
    t_vals = [t]

    while x < x_lim:
        a = aceleracao_func(x,g)
        v += a * dt
        x += v * dt
        t += dt
        x_vals.append(x)
        v_vals.append(v)
        t_vals.append(t)

    return np.array(t_vals), np.array(x_vals), np.array(v_vals)

t, x, vf = simulacao_euler_cromer(aceleracao_ex1, x0, v0, x_max, dt)


plt.plot(t, vf, label='Velocidade simulada')
plt.title("Exercício 1 Pista Linear")
plt.xlabel("Tempo (s)")
plt.ylabel("Velocidade (m/s)")
plt.grid(True)
plt.legend()
plt.show()


print(f"Velocidade final em x=2.5m: {vf[-1]:.2f} m/s")
print(f"Tempo: {t[-1]:.2f} s")


###################################
#c) Podemos comparar os resultados com os obtidos através da conservação da energia.
# Calcule a potencial, 𝐸𝑝, inicial e daí a energia cinética final, 𝐸𝑐
 

def energia_para_velocidade(y, g, m):
    Ep = m * g * y
    return np.sqrt(2 * Ep / m)

# Velocidade teórica via energia (altura inicial: 0.1 m)
v_teorica = energia_para_velocidade(y=0.1, g=g, m=m)

# Gráfico
plt.plot(t, vf, label='Velocidade simulada')
plt.axhline(v_teorica, color='r', linestyle='--', label='Velocidade teórica')
plt.title("Exercício 1 – Pista Linear")
plt.xlabel("Tempo (s)")
plt.ylabel("Velocidade (m/s)")
plt.grid(True)
plt.legend()
plt.show()