In video editing (and animation and other fields), the terms used for what you're talking about are "ease in/out" and "smash in/out", with "ease" meaning to begin or end from a standstill, and "smash" meaning to begin or end with full velocity.
Your existing algorithm gives you "smash in, smash out", since it maintains a constant velocity the whole way across the interpolation.
An easy way to get "ease in, smash out" is to square your fraction before performing the interpolation, like this:
timeI = timeI * timeI;
An easy way to get "smash in, ease out" is to square 1.0-fraction, like this:
timeI = (1.0f - timeI) * (1.0f - timeI);
An easy way to get "ease in, ease out" is to use a hermite interpolator:
timeI = (3.0f * timeI * timeI) - (2.0f * timeI * timeI * timeI);
If you need more control than that, you might consider actually moving your object along a hermite spline rather than interpolating. This would allow you far more precise control over starting and ending velocities for your object.
Copying hermite spline maths from my own code:
Vector3D Spline3D::PositionAtTime( float t ) const
{
float tSquared = t * t;
float tCubed = tSquared * t;
float a = 2.f * tCubed - 3.f * tSquared + 1.f; // 2t^3 - 3t^2 + 1
float b = tCubed - 2.f * tSquared + t; // t^3 - 2t^2 + t
float c = -2.f * tCubed + 3.f * tSquared; // -2t^3 + 3t^2
float d = tCubed - tSquared; // t^3 - t^2
Vector3D result = (a * m_start) +
(b * m_startVelocity) +
(c * m_end) +
(d * m_endVelocity);
return result;
}