You say you are ignoring friction of the air, but assume a partially inelastic collision. That means we can break the problem into two parts:
- While the ball is not in contact with the ground, the height at time $t$ after the last bounce at $t_0$ is given by $$h(t+t_0) = v_0 t - \frac12 g t^2$$ where $v_0$ is the velocity just after the bounce. This velocity will change from one bounce to the next.
- During the impact, the ball will deform and there will be friction. The exact shape of the ball during the impact is hard to capture in a simple equation because it depends on the composition of the ball and the floor. As a simplifying assumption, consider the ball to be a "mass on a slightly lossy spring with a spring constant $k$"; then the ball will exhibit (approximately) damped simple harmonic motion during the impact: this means that the impact time will be independent of the impact velocity(!)
The coefficient of restitution is a parameter of a ball/surface, and reflects the fraction of velocity just after the bounce divided by the velocity just before. For a golf ball, this can be as high as 0.8; for a tennis ball it is around 0.75.
Using $\rho=0.75$, if you drop a ball from a height of 5 m (and putting $g=10~m/s^2$ for convenience) it would land after 1 second with a velocity of 10 m/s, and after the bounce (some short time $\Delta t$) it would come up again with a lower velocity $v_1 = 7.5 m/s$. The time spent in the air until the next bounce is given by $$t_1 = 2\frac{v_1}{g} = 2\rho \frac{v_0}{g}$$
While the ball is in contact with the ground, we can consider its center to move in an approximately sinusoidal fashion - as I said, the important thing is that the contact time is independent of the drop height (on the assumption of linear spring constant). In reality, as the ball deforms more, the spring constant will increase - which will actually make the contact time shorter as the impact velocity is higher. But for your simulation that is unlikely to matter.
To get from the above to a "mathematical model" you might want to modify this python code to your needs:
from math import sqrt
import matplotlib.pyplot as plt
h0 = 5 # m/s
v = 0 # m/s, current velocity
g = 10 # m/s/s
t = 0 # starting time
dt = 0.001 # time step
rho = 0.75 # coefficient of restitution
tau = 0.10 # contact time for bounce
hmax = h0 # keep track of the maximum height
h = h0
hstop = 0.01 # stop when bounce is less than 1 cm
freefall = True # state: freefall or in contact
t_last = -sqrt(2*h0/g) # time we would have launched to get to h0 at t=0
vmax = sqrt(2 * hmax * g)
H = []
T = []
while(hmax > hstop):
if(freefall):
hnew = h + v*dt - 0.5*g*dt*dt
if(hnew<0):
t = t_last + 2*sqrt(2*hmax/g)
freefall = False
t_last = t + tau
h = 0
else:
t = t + dt
v = v - g*dt
h = hnew
else:
t = t + tau
vmax = vmax * rho
v = vmax
freefall = True
h = 0
hmax = 0.5*vmax*vmax/g
H.append(h)
T.append(t)
print("stopped bouncing at t=%.3f\n"%(t))
plt.figure()
plt.plot(T, H)
plt.xlabel('time')
plt.ylabel('height')
plt.title('bouncing ball')
This code produces the following plot:
