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

# Exercício 2 – Pista de forma parabólica (simulação com método de Euler-Cromer)

g = 9.81  # aceleração da gravidade (m/s²)
m = 1.0   # massa (kg)
dt = 0.001  # passo de tempo (s)
x_max = 2.5  # posição limite para a simulação (m)

def func_fx(x):
    if x < 2.0:
        return 0.025 * (x - 2)**2
    else:
        return 0.0
     
def func_dfx(x):
    if x < 2.0:
        return 0.05 * (x - 2)
    else:
        return 0.0

def aceleracao(x):
    return -g * func_dfx(x)

#a) Qual é a derivada desta função 𝑓(𝑥) ? 
# Então qual é a formula aproximada para a aceleração horizontal?
##  A aceleração horizontal é dada por 𝑎(𝑥) = −𝑔𝑓′(𝑥)


x = sy.Symbol('x')
fx = 0.025 * (x - 2)**2
dfx = sy.diff(fx, x)

print("f(x) =", fx)
print("f'(x) =", dfx)



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

x0 = 0.0  # posição inicial (m)
v0 = 0.0  # velocidade inicial (m/s)


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)
        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, x0, v0, x_max, dt)


plt.plot(t, vf, label='Velocidade simulada')
plt.title("Exercício 2 Pista Parabólica")
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")