1. Limited time only! Sign up for a free 30min personal tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Kinematics of a particle with drag

  1. Feb 24, 2013 #1
    (this is all in context to a java 2d object and is not homework related)

    I have an object with velocity [itex]v[/itex] and position [itex]x[/itex].
    Its acceleration is directly proportional to velocity squared ie [itex]a=k v^{2}[/itex].
    Given the objects initial velocity [itex]u[/itex] and its initial position [itex]x_{0}[/itex] how would i work out its velocity and position at time [itex]t[/itex]?

    I have tried integrating:

    [itex]a = \frac{dv}{dt} = kv^{2}[/itex]

    [itex]\int^{v}_{u} v^{-2} dv = \int^{t}_{0} k dt[/itex]

    [itex]\frac{1}{u} -\frac{1}{v} = kt [/itex]

    [itex]v = \frac{1}{\frac{1}{u} - kt}[/itex]

    tbh I got a lot further while writing this post than I did trying to work it out before
    trying to get the new position:

    [itex]\int v^{-2} dv = \int k dt[/itex]

    [itex]-\frac{1}{v} = kt[/itex]

    [itex]v = \frac{dx}{dt} = -\frac{1}{kt}[/itex]

    [itex] \int^{x}_{x_{0}}1\:dx=\int^{t}_{0}-\frac{1}{kt}dt[/itex]


    But you can't [itex]ln|0|[/itex] :/
    So, without bounds:

    [itex]x=-\frac{1}{k}ln|t| + c[/itex]

    Now i'm stuck.

    How would I update the location?

    Also, how would I implement drag while the engines were on?

    Part of my code:
    Code (Text):
    public void update(double delta) {
        if (engines) {
            double dv = Math.sqrt(2 * powerToWeight * delta);
            Vector2f temp = dir.copy(); //dir is the direction of the engine's force
            double dx = dv * delta * 2 / 3;
            temp = velo.copy();
            // TODO add drag
        } else {
            velo.i = (float) (1 / ( (1 / velo.i) - drag * delta ));
            velo.j = (float) (1 / ( (1 / velo.j) - drag * delta ));
            // TODO update location
    Pleased with myself for using the itex tags for the first time :D

    Edit: could this be considered a hw-type question?
    Last edited: Feb 24, 2013
  2. jcsd
  3. Feb 24, 2013 #2


    User Avatar
    2017 Award

    Staff: Mentor

    You can integrate this to get the position, there is no need to derive v(t) again.

    If you do it in time steps: ##x += v \delta t##

    Add this as acceleration, try to derive v(t) again. If that does not work, do it in time steps.
  4. Feb 24, 2013 #3
    I forgot [itex]u[/itex] was a constant :P ok so:

    [itex]\int^{x}_{x_{0}}1\;dx=\int^{t}_{0}\frac{1}{\frac{1}{u} - kt}dt[/itex]

    [itex]x-x_{0} = -\frac{1}{k}\;[\;ln|\frac{1}{u} - kt|\;]^{t}_{0}
    = -\frac{1}{k}(\;ln|\frac{1}{u} - kt|\; - \;ln|\frac{1}{u}|\;) = -\frac{1}{k}\;ln|1-ktu|[/itex]

    so i'm guessing i do this separately for each component of the vector :)
    Thank you for pushing me xD
  5. Feb 24, 2013 #4


    User Avatar
    2017 Award

    Staff: Mentor

    In general, you cannot separate those components, they are coupled. Without other sources of acceleration, the motion happens in one dimension only, so you can rotate that x in the appropriate direction.
  6. Feb 24, 2013 #5
    O .. i was pretty sure you could separate the [itex]i[/itex] and [itex]j[/itex] components.
    but a problem occurs when [itex]u[/itex] is a large positive

    here is part of my update method now when there are no other forces on the object:
    Code (Text):
    if (velo.i != 0) {
        loc.i += (float) (Math.log(1 - dragConst * delta * velo.i) / dragConst);
        velo.i = (float) (1 / ((1 / velo.i) - dragConst * delta));

    if (velo.j != 0) {
        loc.j += (float) (Math.log(1 - dragConst * delta * velo.j) / dragConst);
        velo.j = (float) (1 / ((1 / velo.j) - dragConst * delta));
    Last edited: Feb 24, 2013
  7. Feb 24, 2013 #6


    User Avatar
    2017 Award

    Staff: Mentor

    Wait... if you update it step by step, why do you use the general formula?
    What about velo.i = velo.i - velo.i*sqrt(velo.i^2 + velo.j^2)*k?

    I hope I got the angles right.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook