Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Time-step independent friction model

  1. Jul 22, 2004 #1

    TK

    User Avatar

    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.
    Thanks in advance!




    All the best!


    TK
     
    Last edited: Jul 26, 2004
  2. jcsd
  3. Jul 22, 2004 #2

    Integral

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    I do not see any way that your calculations can be time step independent, please provide more information about what you mean.

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

    [tex] move_x = time_{step} * (speed_x + (time_{step} * \frac {acc_x} 2)) [/tex]

    to get a distance.
     
  4. Jul 22, 2004 #3

    TK

    User Avatar

    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
  5. Jul 23, 2004 #4

    TK

    User Avatar

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

    TK

    User Avatar

    Has anyone got any ideas?
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Time-step independent friction model
Loading...