Kinematics of a particle with drag

Join the discussion
Registration is free. Start your own thread to ask a follow-up.
5 replies · 3K views
chimpz
Messages
7
Reaction score
0
(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]

[itex]x-x_{0}=-\frac{1}{k}\left[\:ln|t|\:\right]^{t}_{0}[/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:
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
		temp.scale(dv);
		velo.add(temp);
		double dx = dv * delta * 2 / 3;
		temp = velo.copy();
		temp.scale(dx);
		loc.add(temp);
		// 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:
Physics news on Phys.org
chimpz said:
[itex]v = \frac{1}{\frac{1}{u} - kt}[/itex]
You can integrate this to get the position, there is no need to derive v(t) again.

How would I update the location?
If you do it in time steps: ##x += v \delta t##

Also, how would I implement drag while the engines were on?
Add this as acceleration, try to derive v(t) again. If that does not work, do it in time steps.
 
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} <br /> = -\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
 
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.
 
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 positivehere is part of my update method now when there are no other forces on the object:
Code:
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:
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.