Integrate a function over a triangle area
Show older comments
Hi, I'm trying to integrate a function over the area of a triangle, that is given by a set of 3 arbitrary points. My problem is that because the points are arbitrary, my program doesn't take into account that dA doesn't really equal dy.dx. Now, is there a predefined function that can do the integration over the area given by 3 points?
Here's my current code:
function [Ke]=Ke(F,ex,ey)
%F=@(x,y)(x/2 - y/2 + 1/2)^2 + (x/2 + y/2 - 1/2)^2 + y^2
%ex=[0 -1 1]
%ey=[1 0 0]
syms x y
x1= ex(1);
x2= ex(2);
x3= ex(3);
y1= ey(1);
y2= ey(2);
y3= ey(3);
Ke=zeros(3,3)
for i=1:3;
for j=1:3;
Ke(i,j)=integral2(F,x,ex(i),ex(j),ey(i),ey(j))
K=K+Ke(i,j)
end
end
3 Comments
Bruno Luong
on 17 Nov 2018
Edited: Bruno Luong
on 17 Nov 2018
IMO you have a much bigger problem than not knowing dA.
Your code adds the integrals of function 9 rectanges (3 x 3 pairs of x and y intervals), which won't give the integral on triangle at all.
This code is emply incorrect to start with.
John D'Errico
on 17 Nov 2018
Is your function truly known, and as simple as the one you show? If so, you can write an analytical integral, there is no need for a call to integral2.
Jafar Alrashdan
on 17 Nov 2018
Edited: Jafar Alrashdan
on 17 Nov 2018
Accepted Answer
More Answers (2)
Bruno Luong
on 17 Nov 2018
Edited: Bruno Luong
on 17 Nov 2018
Here is a method.
Assuming you triangle T has 3 vertexes P1, P2, P3, each vertex Pi has corrdinates (xi,yi).
Any point P inside a triangle can be written as barycentric coordinates (w1,w2,w3)
P = w1*P1 + w2*P2 + w3*P3
with wi such that
0 <= wi <=0
and
w1+w2+w3 = 1.
Integral of f on T written in barycentric cooordinates becomes
|T|/2 Integral f(w1*P1+w2*P2+(1-w1-w2)*P3) (dw1*dw2)
the integral is carried out on the "right" triangle domain T12 (where |T| is the area of the original triangle T given later):
T12: = { (w1,w2): 0<=w1<=1; 0<=w2<=1-w1 }.
So what you should do is compute this double-cascaded integrals:
|T|/2 * integral_(w1 in (0,1)) integral (w2 in (0,1-w1)) f(w1*P1+w2*P2+(1-w1-w2)*P3) dw2 dw1.
The area |T| (dA) can be computed
|T| = 0.5* abs(det (P2-P1,P3-P1))
MATLAB code
function I = TriIntegral(f, Tx, Ty)
% I = TriIntegral(f, Tx, Ty)
% 2D integration of f on a triangle
% INPUTS:
% - f is the vectorized function handle that when calling f(x,y) returns
% function value at (x,y), x and y are column vectors
% - Tx,Ty are is two vectors of length 3, coordinates of the triangle
% OUTPUT
% I: integral of f in T
T = [Tx(:), Ty(:)];
I = integral2(@(s,t) fw(f,s,t,T),0,1,0,1);
A = det(T(2:3,:)-T(1,:));
I = I*abs(A);
end % TriIntegral
%%
function y = fw(f, s, t, T)
sz = size(s);
w1 = (1-s); % Bug fix
w2 = s.*t;
w3 = 1-w1-w2;
P = [w1(:),w2(:),w3(:)] * T;
y = feval(f,P(:,1),P(:,2));
y = s(:).*y(:);
y = reshape(y,sz);
end
Apply to your example:
F=@(x,y)(x/2 - y/2 + 1/2).^2 + (x/2 + y/2 - 1/2).^2 + y.^2;
ex=[0 -1 1;
ey=[1 0 0];
TriIntegral(F,ex,ey)
>> ans =
0.5000
8 Comments
Bruno Luong
on 17 Nov 2018
Note:
I = integral_(w1 in (0,1)) integral (w2 in (0,w1)) g(w1,w2) dw1 dw2
Can be transformed to an integral on square, thus using integral_2
I = integral_(s in (0,1)) integral (t in (0,1)) g(s,s*t)*s ds dt
Bruno Luong
on 17 Nov 2018
Note 2:
If you have f polynomial function; the integration can be computed by using Gauss and weight points. Checkout https://en.wikipedia.org/wiki/Gaussian_quadrature
Jafar Alrashdan
on 17 Nov 2018
Bruno Luong
on 17 Nov 2018
Not complicated at all if you don't want to reinvent the wheel.
You have many File Exchange available that compute the Points and Weights with respect to the Barycentric coordinates (again), and apply it is simply a matter of summing up the function.
Jafar Alrashdan
on 17 Nov 2018
John D'Errico
on 17 Nov 2018
As I showed in my response, a Gaussian integration is simple, if you use Greg's code to give a Gaussian integration over a simplex.
Bruno Luong
on 17 Nov 2018
wops, I made a mistake, w2 should be in (0,1-w1). Code and text corrected accordingly
Bruno Luong
on 18 Nov 2018
Try the same test than John's, it differs by 2 last digits.
The advantage of using integral2 over Gaussian quadrature is that it will automatically adapt to the function smoothness and you don't have to ask whereas it converges or not.
F = @(x,y) sin(x+y).*cos(x-2*y)
ex=[0 -1 1];
ey=[1 0 0];
TriIntegral(F,ex,ey)
ans =
0.188712575302678
madhan ravi
on 17 Nov 2018
Edited: madhan ravi
on 17 Nov 2018
0 votes
1) Find the equation of the 3 lines connecting the three points.
2)Split the domain according to upper limit and lower limit by substituting the points in the domain you can determine it.
3) Use double integration in each domain and sum up all the integrals to attain the final triangulare area.
5 Comments
Jafar Alrashdan
on 17 Nov 2018
madhan ravi
on 17 Nov 2018
I know what you mean but the domain can only be defined by the user becuase matlab won't analayse the upper and lower limits by itself.
Jafar Alrashdan
on 17 Nov 2018
madhan ravi
on 17 Nov 2018
Your welcome , if you do it publish it as file exchange
Jafar Alrashdan
on 17 Nov 2018
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!