46 views (last 30 days)

Apologies if this has already been answered in another form elsewhere on the forums, however I couldn't find any answers that helped me directly with my code. I currently have code that maps the profile and area of a channel. I wish to have a horizontal y value across my channel width to simulate the fluctuating water level, the example line is shown in the image as the green line. So for example I would want to calculate and shade the area underneath the greenline only.

With the function would I be able to loop the same function for a range of values for the horizontal values, to provide an output I could then plot? A vector form would be ideal if possible.

I've already tried to use the area and fill commands unsuccesfully, or maybe I was not using the correct format for them.

I've also attached the relevant code below, any help would be much appreciated.

x = [ 0 1 2 3 4 5 6 7 8 9 10 11 12];

y = -[0 -0.5 -0.8 -0.8 -1 -1.1 -1.2 -1.2 -1.4 -1.2 -1.1 -1 0]; % y values in image were produced by rand function

subplot(2, 1, 1);

area(x,-y)

grid on;

hold on;

for k = 1 : length(x)

xline(x(k), 'Color', 'k');

end

yt = yticks;

for k = 1 : length(yt)

yline(yt(k), 'Color', 'k');

end

plot (x, -y, 'r.-', 'LineWidth', 3, 'MarkerSize', 30)

hold on

yline(-0.5,'g',11);

xlabel('Chainage (m)', 'FontSize', 11);

ylabel('Depth (m)', 'FontSize', 11);

An = (trapz(x,y)); % Overall area.

% Compute areas within each pair of x locations.

midpoints = (y(1:end-1) + y(2:end))/2;

deltax = diff(x);

Ani = deltax .* midpoints;

subplot(2, 1, 2);

bar(x(1:end-1)-x(1)+ 0.5, Ani);

title('Areas of Slices', 'FontSize', 14);

xlabel('x', 'FontSize', 11);

ylabel('Area (m^2)', 'FontSize', 11);

grid on;

esat gulhan
on 21 Aug 2020

clc;clear;

x = [ 0 1 2 3 4 5 6 7 8 9 10 11 12];

y = [0 -0.5 -0.8 -0.8 -1 -1.1 -1.2 -1.2 -1.4 -1.2 -1.1 -1 0];

h0= -0.5; %the axis in the graph

h=ones(size(x))*h0;

Int=pchip(x,y);

xx=linspace(x(1),x(end),500);

yy=y-h0;

yyy=pchip(x,yy,xx);

gt=yyy<0;

theArea =-trapz(xx(gt), (yyy(gt)))

hold off

area(xx, min(ppval(Int,xx), h(1)), h(1), 'EdgeColor', 'none', 'FaceColor', 'b'),grid,

hold on

plot(xx,ppval(Int,xx),'k',xx,h0,'Linewidth',2)

set(gca, 'XLim', [x(1) x(end)], 'YLim', [min(y) 0]);

title(strcat('BlueArea=', num2str(theArea)))

xlabel('Chainage (m)', 'FontSize', 11);

ylabel('Depth (m)', 'FontSize', 11);

You can change h0 which is horizontal line. when h0=-1

when h0=-0.5

when h0=0

I RESHAPED YOUR X AND Y DATAS 500 INTERVALS WITH PCHIP INTERPOLATION, IF NOT THE DATA IS NOT ENOUGH FOR GOOD SOLUTION.

esat gulhan
on 22 Aug 2020

There are ways to predict values from datas. Spline, pchip, makima ,lineer interpolation are commom. Lagrange, ortoganal polynoms, fourier can be used too. You should learn the ways of interpolations. You can learn in cfit data tool or you can lear in matlab notes.

I prefer here pchip in interpolation.

esat gulhan
on 23 Aug 2020

esat gulhan
on 21 Aug 2020

Edited: esat gulhan
on 21 Aug 2020

x = [ 0 1 2 3 4 5 6 7 8 9 10 11 12]

y = -[0 -0.5 -0.8 -0.8 -1 -1.1 -1.2 -1.2 -1.4 -1.2 -1.1 -1 0]

Int=pchip(x,y)

plot(x,ppval(Int,x))

MIItemp = (fnint(Int))

Area = fnval(MIItemp,12)%Area between 0 12

If you want to find area between 0-5 , Area = fnval(MIItemp,5)

There are other ways but this is the easiest way .

Note:If your matlab is latetest version you can write makima(x,y),instead of phcip(x,y). If your lines are strict use makima

esat gulhan
on 22 Aug 2020

Did you see my second answer. I think it helps.

If you add pause to the code it will seem like an animation.

clc;clear;

x = [ 0 1 2 3 4 5 6 7 8 9 10 11 12];

y = [0 -0.5 -0.8 -0.8 -1 -1.1 -1.2 -1.2 -1.4 -1.2 -1.1 -1 0];

for h0= 0:-0.04:-2; %the axis in the graph

h=ones(size(x))*h0;Int=pchip(x,y);xx=linspace(x(1),x(end),500);

yy=y-h0;yyy=pchip(x,yy,xx);gt=yyy<0;theArea =-trapz(xx(gt), (yyy(gt)))

hold off

area(xx, min(ppval(Int,xx), h(1)), h(1), 'EdgeColor', 'none', 'FaceColor', 'b'),grid,

hold on

plot(xx,ppval(Int,xx),'k',xx,h0,'Linewidth',2)

set(gca, 'XLim', [x(1) x(end)], 'YLim', [min(y) 0]);

title(strcat('BlueArea=', num2str(theArea)))

xlabel('Chainage (m)', 'FontSize', 11);ylabel('Depth (m)', 'FontSize', 11);pause(0.00001)

end

Opportunities for recent engineering grads.

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

Start Hunting!
## 0 Comments

Sign in to comment.