Integration of Known Dataset to specific value

3 views (last 30 days)
So I was working on a problem, and while I found a solution that works, its very ineligant and I was wondering out of pure curosity if anyone knows of a better method. I did my best to describe my problem below, and added a photo for better understanding.
I have a large matrix of data (i,j) where each cell holds the density value at a node as it evolves with time where time occupies i and space occupies j. The cell density is held at each cell position (i,j). The x-positions are discretized so that the distance between two nodes is 50ft. My goal is to find the x position where an integral of the density*length = an area. It should be noted that the units are not standard units, but density is cars/ft and length is ft. I want to find when an integrated area is equal to a specific value (in this case = 1) when starting from the right side and working towards the left. I know that this explaination may be hard to follow, so I have included a hand drawn sketch of the situation below. In the photo, I have some values from a single row added because I was doing my own math, but every single row of the matrix holds a series of density values similar to what I have drawn. The slope between two points is not consistent and I am looking for an x position inbetween nodes.
Here is the code I ended up writing:
for h = 1:t_span % does this for each time level
area = 0;
for i = x_span:-1:26
x_1 = x_range(i-1);
x_2 = x_range(i);
y_1 = store_p(h,i-1);
y_2 = store_p(h,i);
x = [x_1; x_2];
y = [y_1; y_2];
Q = trapz(x,y);
area = area + Q;
if abs((area-1))<0.01
if s == 1
first_car_location_1(1,h) = x_1;
elseif s == 2
first_car_location_2(1,h) = x_1;
first_car_location_3(1,h) = x_1;
new_length = 45;
if area >= 1
overshoot = area - 1;
for j = 1:25
a_1 = 0;
a_2 = new_length;
a = [a_1;a_2];
b_1 = y_1;
b_2 = (y_2-y_1)*a_2/50 + y_1;
b = [b_1; b_2];
new_area = trapz(a,b);
if new_area - overshoot > 0.001
new_length = new_length-2;
if s == 1
first_car_location_1(1,h) = x_range(i-1)+a_2;
elseif s == 2
first_car_location_2(1,h) = x_range(i-1)+a_2;
first_car_location_3(1,h) = x_range(i-1)+a_2;
end %end for loop for new length
break % kick out of if area >= 1 statment
OF NOTE: store_p is the matrix itself, where the dimensions are (time t, position x), t_span is the i dimension length, x_span is the j dimension length. I stop at 26 because in my x_range thats where x becomes negative and thus is a bound of the problem.
If you are interested in why im doing this, its an analysis of the traffic equation for a class.
Again, my solution works and gives me the answers I need, but my answer seems very barbaric, just looking for ways to do something similar in the future a little more neatly.
Thank you, Braden

Answers (1)

Prudhvi Peddagoni
Prudhvi Peddagoni on 28 Dec 2020
You can use cumtrapz function for this. You can find the documentation for this function here.
It basically gives you the vector of all the area values up until that point.
Hope this helps.




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!