How can I compute the Area and the Centroid of the following shape?

How can I compute the Area and the Centroid of the following shape?
I have used the following code to construct it:
xA = 0;
xB = 1;
xf = 1
xf = 1
x = linspace(0, xf, xf*1e4 + 1);
a = 9.2; %
c = 0.5; % center of function
Y = sigmf(x, [a c]).*((0 <= (x - xA)) & ((x - xA) < (xB - xA)));
plot(x, Y, 'linewidth', 1.5), grid on, xlim ([0 1.1])

6 Comments

You have the functional equation. So you can use "int" or "integral".
The integral formula for the centroid is given here:
Section:
Locating by integral formula of a bounded region.
@Torsten Thanks. Is there a MATLAB function can help to copmute the centroid in this case?
For functional areas: not that I know of.
But the formulae given in Wikipedia are not that complicated, are they ?
@Torsten does the g(x) in my case is the x axis?
and the x is the length of the x?
@Torsten If that the case, the x_Centroid will be the length of the x always?
Hi @Star Strider, Do you have any idea how to compute the centroid here. Thanks

Sign in to comment.

 Accepted Answer

The polyshape approach is the easiest way to go on this.
However it is possible to calculate this using the trapz function and the centroid definition —
xA = 0;
xB = 1;
xf = 1
xf = 1
x = linspace(0, xf, xf*1e4 + 1);
a = 9.2; %
c = 0.5; % center of function
Y = sigmf(x, [a c]).*((0 <= (x - xA)) & ((x - xA) < (xB - xA)));
cx = trapz(x,x.*Y) ./ trapz(x,Y)
cx = 0.7138
cy = trapz(Y,x.*Y) ./ trapz(Y,x)
cy = 0.3934
p = polyshape(x,Y);
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
[xc,yc] = centroid(p)
xc = 0.7176
yc = 0.3974
figure
plot(x, Y, 'linewidth', 1.5), grid on, xlim ([0 1.1])
The values from the two approaches are not exactly the same, however they are reasonably close.
.

3 Comments

@Star Strider Thank you so much.
What do you think of the approach that Torsten suggested (https://en.wikipedia.org/wiki/Centroid
Section:
Locating by integral formula of a bounded region)
Do you think it gives more accurate answer?
Because any difference it causes effects in my application
Thanks
As always, my pleasure!
That is esentially the approach I used, with trapz.
The polyshape approach may be more accurate, however the difference is slight —
xA = 0;
xB = 1;
xf = 1;
x = linspace(0, xf, xf*1e4 + 1);
a = 9.2; %
c = 0.5; % center of function
Y = sigmf(x, [a c]).*((0 <= (x - xA)) & ((x - xA) < (xB - xA)));
cx = trapz(x,x.*Y) ./ trapz(x,Y)
cx = 0.7138
cy = trapz(Y,x.*Y) ./ trapz(Y,x)
cy = 0.3934
p = polyshape(x,Y);
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
[xc,yc] = centroid(p)
xc = 0.7176
yc = 0.3974
x_accuracy = abs(xc-cx)/mean([xc cx])
x_accuracy = 0.0053
y_accuracy = abs(yc-cy)/mean([yc cy])
y_accuracy = 0.0100
figure
plot(x, Y, 'linewidth', 1.5, 'DisplayName','Data'), grid on, xlim ([0 1.1])
hold on
plot(cx,cy,'r+', 'DisplayName','trapz')
plot(xc,yc,'rx', 'DisplayName','polyshape+centroid')
hold off
legend('Location','best')
The relative deviation of the individual values from the mean of each set is about 0.5% for the x-coordinate and about 1% for the y-coordinate. I am not certain how accurate they can be.
.
I used the expressiion described in By integral formula in the Centroid article iin Wikipedia.
Later, I also wrote an anonymous function for it:
ctrd = @(x,y) [trapz(x, x.*y) / trapz(x, y); trapz(y, x.*y) / trapz(y, x)]; % Returns: [Centroid x-Coordinate; Centroid y-Coordinate]
The (x,y) arguments are the ‘x’ and ‘y’ vectors describing the outline of the region.
.

Sign in to comment.

More Answers (4)

xA = 0;
xB = 1;
a = 9.2;
c = 0.5;
sfun = @(x)sigmf(x, [a c]);
Area = integral(@(x)sfun(x),xA,xB);
xc = integral(@(x)sfun(x).*x,xA,xB)/Area
xc = 0.7138
yc = integral(@(x)sfun(x).^2,xA,xB)/(2*Area)
yc = 0.3935
Hi @M
If your intention is to find the defuzzified output value for membership function mf at the interval in x using the centroid method, then you can try this method:
xA = 0;
xB = 1;
x = xA:0.0001:xB;
mf = sigmf(x, [9.2 0.5]);
plot(x, mf), grid on, xlim([-0.2 1.2]), ylim([0 1.2]), xlabel('\it{x}'), ylabel('\mu(\it{x})')
xc = defuzz(x, mf, 'centroid')
xc = 0.7138
xline(xc, '--', sprintf('%.4f', xc), 'LabelVerticalAlignment', 'middle');
Note that there should be no significant difference between
mf = sigmf(x, [9.2 0.5]).*((0 <= (x - xA)) & ((x - xA) < (xB - xA)));
and
mf = sigmf(x, [9.2 0.5]);
centroid
Centroid of polyshape
Syntax
Description
[x,y] = centroid(polyin) returns the x-coordinates and the y-coordinates of the centroid of a polyshape.
[x,y] = centroid(polyin,I) returns the coordinates of the centroid of the Ith boundary of polyin.
This syntax is only supported when polyin is a scalar polyshape object.

4 Comments

@Image Analyst I didnt get you. Can you explain please!
You didn't look up the help for polyshape, did you? It's just as trivial as @Star Strider showed:
p = polyshape(x,Y);
[x,y] = centroid(p)

Sign in to comment.

% Define the functions
f1 = @(x) 0.5 * (80.94 - 0.25 * exp(2 * x.^2));
f2 = @(x) 8.997 - 0.5 * exp(x.^2);
% Define the limits of integration
a = 0;
b = 1.7;
% Use MATLAB's integral function
numerator = integral(f1, a, b);
denominator = integral(f2, a, b);
% Calculate the centroid
centroid = numerator / denominator;
% Display the results
fprintf('Numerator: %.4f\n', numerator);
fprintf('Denominator: %.4f\n', denominator);
fprintf('Centroid: %.4f\n', centroid);

Products

Release

R2022b

Asked:

M
M
on 11 Sep 2022

Commented:

on 4 Nov 2024

Community Treasure Hunt

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

Start Hunting!