It works perfectly, at least on paper. Has anyone else ever used an approach like this? Or is there a better way to do it?
It's the correct way of doing it... You are essentially multiplying with (1-friction) every time step so over multiple time steps the "correction" is (1-friction)^n and not
Edit: n*(1-friction) would be totally off