Integrate a function over a triangle area
古いコメントを表示
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 件のコメント
Bruno Luong
2018 年 11 月 17 日
編集済み: Bruno Luong
2018 年 11 月 17 日
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
2018 年 11 月 17 日
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
2018 年 11 月 17 日
編集済み: Jafar Alrashdan
2018 年 11 月 17 日
採用された回答
その他の回答 (2 件)
Bruno Luong
2018 年 11 月 17 日
編集済み: Bruno Luong
2018 年 11 月 17 日
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 件のコメント
Bruno Luong
2018 年 11 月 17 日
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
2018 年 11 月 17 日
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
2018 年 11 月 17 日
Bruno Luong
2018 年 11 月 17 日
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
2018 年 11 月 17 日
John D'Errico
2018 年 11 月 17 日
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
2018 年 11 月 17 日
wops, I made a mistake, w2 should be in (0,1-w1). Code and text corrected accordingly
Bruno Luong
2018 年 11 月 18 日
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
2018 年 11 月 17 日
編集済み: madhan ravi
2018 年 11 月 17 日
0 投票
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 件のコメント
Jafar Alrashdan
2018 年 11 月 17 日
madhan ravi
2018 年 11 月 17 日
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
2018 年 11 月 17 日
madhan ravi
2018 年 11 月 17 日
Your welcome , if you do it publish it as file exchange
Jafar Alrashdan
2018 年 11 月 17 日
カテゴリ
ヘルプ センター および File Exchange で Creating and Concatenating Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
