# Time-step independent friction model

1. Jul 22, 2004

### TK

Help with Friction

Greetings , all fellow scientists!

I've been struggling with time-step independent physics for a programming project. The problem is that it doesn't seem to be time-step independent after all. Here's some of it in a pseudo-code form. It seems to be the friction part where it goes wrong. The reason I'm calculating friction like that anyway is because this way has a nice property of limiting the speed. ( Should implement surface friction and drag separately for better simulation though. ) The following gets executed at varying intervals. Hope the variable names are self-explanatory.
Code (Text):

calc acc vector without friction
acc_x = time_step * ( move_force_x / mass )
acc_y = time_step * ( move_force_y / mass )
acc_z = time_step * ( move_force_z / mass )

calc movement vector without friction
move_x = time_step * ( speed_x + ( acc_x / 2 ) )
move_y = time_step * ( speed_y + ( acc_y / 2 ) )
move_z = time_step * ( speed_z + ( acc_z / 2 ) )

calc and apply friction
move_force_x = move_force_x - ( move_x * friction_coefficient )
move_force_y = move_force_y - ( move_y * friction_coefficient )
move_force_z = move_force_z - ( move_z * friction_coefficient )

calc acc vector
acc_x = time_step * ( move_force_x / mass )
acc_y = time_step * ( move_force_y / mass )
acc_z = time_step * ( move_force_z / mass )

calc movement vector
move_x = time_step * ( speed_x + ( acc_x / 2 ) )
move_y = time_step * ( speed_y + ( acc_y / 2 ) )
move_z = time_step * ( speed_z + ( acc_z / 2 ) )

calc new speed
speed_x = speed_x + acc_x
speed_y = speed_y + acc_y
speed_z = speed_z + acc_z

calc new pos
pos_x = pos_x + move_x
pos_y = pos_y + move_y
pos_z = pos_z + move_z

And now in a shorter form joining the coordinates to vector-type variables. Could have only posted that one but then the variable names would have been less self-explanatory.
Code (Text):

calc acc vector without friction
V_acc = time_step * ( V_move_force / mass )

calc movement vector without friction
V_move = time_step * ( V_speed + ( V_acc / 2 ) )

calc and apply friction
V_move_force = V_move_force - ( V_move * friction_coefficient )

calc acc vector
V_acc = time_step * ( V_move_force / mass )

calc movement vector
V_move = time_step * ( V_speed + ( V_acc / 2 ) )

calc new speed
V_speed = V_speed + V_acc

calc new pos
V_pos = V_pos + V_move

Maybe it's more like a mathematical question but anyway it is wrong to separate those sciences. The physics are not complex here and that's why I thought it'd do with lesser explanation on what it is supposed to do and so on. In case the above is how it should be after all I'll take a look at the part where it calculates the time-step in the 1st place.

All the best!

TK

Last edited: Jul 26, 2004
2. Jul 22, 2004

### Integral

Staff Emeritus

This will not give you the correct position. You are adding a velocity to an acceleration, you need to do this:

$$move_x = time_{step} * (speed_x + (time_{step} * \frac {acc_x} 2))$$

to get a distance.

3. Jul 22, 2004

### TK

Hiya , Integral!

Thank You for a really fast reply! Thought I'd have to wait atleast until tomorrow morning.
Anyway , it should be a nice , little optimization. Follow the flow of the code...
Code (Text):

calc acc vector without friction
V_acc = time_step * ( V_move_force / mass )

calc movement vector without friction
V_move = time_step * ( V_speed + ( V_acc / 2 ) )

...acceleration is premultiplied with time-step. Should of have made it clearer though and perhaps named the variable differently.

Last edited: Jul 22, 2004
4. Jul 23, 2004

### TK

Had a mistype( typo ) there...
This is not the case with the real thing though.
So , has anyone got any ideas? Thank You!

5. Jul 26, 2004

### TK

Has anyone got any ideas?