Kinematics of a particle with drag

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:
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.
 

Similar threads

  • · Replies 11 ·
Replies
11
Views
3K
Replies
9
Views
2K
  • · Replies 18 ·
Replies
18
Views
2K
  • · Replies 30 ·
2
Replies
30
Views
3K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 17 ·
Replies
17
Views
2K
  • · Replies 19 ·
Replies
19
Views
3K
  • · Replies 7 ·
Replies
7
Views
6K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
6
Views
2K