# 수치 계산: 삼각형 적분

Python WeChat 주문 애플릿 강좌 동영상

https://edu.csdn.net/course/detail/36074

Python 실용성 있는 양적거래 재무관리 시스템

https://edu.csdn.net/course/detail/35475

수치 계산: 삼각 적분

이 책은 이전 장 "Gauss-Lelande 적분 공식" 에서 계속됩니다.

**요구사항:** 주어진 공간 삼각형 ΔABCΔABC\Delta ABC, A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3)A(x1,y1,z1 ) ,B(x2,y2,z2),C(x3,y3,z3)A(x_1,y_1,z_1),B(x_2,y_2,z_2),C(x_3,y_3,z_3), 알려진 함수 f (x ,y,z)f(x,y,z)f(x,y,z), 수치적 방법을 사용하여 적분을 푼다: ∬ΔABCf(x,y,z)dS∬ΔABCf(x,y,z) dS \iint_{\Delta ABC}f(x,y,z)\text dS.

**해결책:** Triangle_lyness_rule에서 제공하는 적분 방법을 참고하세요 . 구체적인 내용은 이해가 안 되지만 개념은 가우스 적분과 유사합니다. 적분 평면에서 적분점과 계수 가중치를 계산하여 적분합니다 .

삼각 적분점 및 적분 중량 계산

삼각형 라이니스 규칙

Triangle_lyness_rule은 표준 삼각형의 계수 점 위치와 가중치 계수를 다른 순서로 제공합니다. 예를 들어, 아래 그림은 Rule=10Rule=10Rule=10일 때 통합점 위치와 가중치 계수를 보여줍니다. 다음 표는 통합 정확도 PrecisionPrecisionPrecision 통합 포인트 수 orderorderorder와 통합 포인트가 다른 RuleRuleRule 아래에 삼각형 centercentercentercenter를 포함하는지 여부를 보여줍니다.

영상

규칙 주문하다 정도 센터
0 1 1
1 2 아니요
2 4 2
4
4 7
5 6 4 아니요
6 10 4
7 9 4 아니요
8 7 5
9 10 5
10 12 6 아니요
11 16 6
12 13 6
13 13 7
14 16 7
15 16 8
16 21 8 아니요
17 16 8
18 19 9
19 22 9
20 27 11 아니요
21 28 11

좌표변환

영상

좌표변환관계는 이전 글의 "가우스-르랑드 적분식" 의 형상함수법을 이용하여 계산한다. 3절점 형상 함수를 구하고 나머지 단계는 "Gauss-Lelande 적분 공식" 의 단계와 유사합니다 .

⎧⎩⎨N1(s,t)=1−s−tN2(s,t)=sN3(s,t)=t{N1(s,t)=1−s−tN2(s,t)=sN3( s,t)=t\begin{사례}
N_1(s,t)=1-st\
N_2(s,t)=s\
N_3(s,t)=t\
\end{사례}\

개선하다

Brother KY의 안내에 따라 위 단계를 더욱 단순화할 수 있습니다. 그 이유는 삼각형 좌표변환의 형상 함수가 간단하고 좌표 연산을 직접 수행할 수 있기 때문이며, 야코비 계수는 삼각형의 면적과 직접적으로 동일하다.자세한 내용은 코드를 참조한다.

포인트 테스트

다음은 테스트 통합 기능입니다.LYNESSRULE.txtLYNESSRULE.txtLYNESS_RULE.txt에 저장된 데이터가 너무 길어 업데이트 웨어하우스로 Gitee:링크 에 넣어두었습니다 .

%% 测试三角形积分
clc;clear;
global TriCoeff
% 导入积分系数
TriCoeff=loadLynessFromTxT("LYNESS_RULE.txt");

P1=[0,0,0];
P2=[2,0,0];
P3=[0,3,0];
% 积分函数
func=@(x,y,z) (x^6+y^3+1);

count=1;
for rule=0:1:21
    [P_W] = getTrianglePoints([P1;P2;P3],rule);
    [N,~]=size(P_W);
    res=0;
    for i=1:1:N
        res=res+func(P\_W(i,1),P\_W(i,2),P\_W(i,3))*P\_W(i,4);
    end
    resA(count,1)=res;
    resA(count,2)=rule;
    resA(count,3)=N;
    count=count+1;
end

%% matlab 自带积分函数
pfun = @(x,y) (x.^6+y.^3+1);
xmin = 0;
xmax = 2;
ymin = 0;
ymax = @(x) -3/2*x+3;
r = integral2(pfun,xmin,xmax,ymin,ymax);

%% plot
figure(22)
plot(resA(:,2),resA(:,1),'r-o');hold on;
plot(resA(:,2),r*ones(22,1),'b-');grid on;
xticks([0:2:22]);
xlim([0,22]);
legend("TRIANGLE LYNESS RULE 积分","Matlab integral2积分");
text(10,14,"积分函数:(x^6+y^3+1)")
text(10,12,"积分区域:(0,0,0),(2,0,0),(0,3,0)");
xlabel("Lyness Rule");
ylabel("积分数值");

포인트 결과 비교

영상

암호

getTrianglePoints.m

function [P_W] = getTrianglePoints(Triangle,Rule)
% getTrianglePoints 三角形面元积分
% https://people.sc.fsu.edu/~jburkardt/cpp\_src/triangle\_lyness\_rule/triangle\_lyness\_rule.html
% 输入:
% Triangle(3,3):三角形面元三个点
% Rule:triangle\_lyness\_rule
% 输出:
% P\_W(:,4):P\_W(:,1:3)积分点、P\_W(:,4)权重系数

%% 任意空间三角形 =》平面直角三角形 坐标转换
% 形函数
N1=@(s,t) -s-t+1;
N2=@(s,t) s;
N3=@(s,t) t;
N1_s=@(s,t) -1;
N2_s=@(s,t) 1;
N3_s=@(s,t) 0;
N1_t=@(s,t) -1;
N2_t=@(s,t) 0;
N3_t=@(s,t) 1;

P1=Triangle(1,:);
P2=Triangle(2,:);
P3=Triangle(3,:);

global TriCoeff;
data=TriCoeff{Rule+1,1};
[order,~]=size(data);
P_W=zeros(order,4);

for i=1:1:order
    P\_W(i,1:3)=Loc2Glo(data(i,1:2));
    P\_W(i,4)=data(i,3)*Jacobi(data(i,1:2));
end
    function Pglobal=Loc2Glo(loc)
        %loc(1,2)
        Pglobal=N1(loc(1),loc(2))*P1+...
            N2(loc(1),loc(2))*P2+...
            N3(loc(1),loc(2))*P3;
    end

    function J=Jacobi(Loc)
        s=N1\_s(Loc(1),Loc(2))*P1+...
            N2\_s(Loc(1),Loc(2))*P2+...
            N3\_s(Loc(1),Loc(2))*P3;
        t=N1\_t(Loc(1),Loc(2))*P1+...
            N2\_t(Loc(1),Loc(2))*P2+...
            N3\_t(Loc(1),Loc(2))*P3;
        %三角形,这里多除了一个2
        J=norm(cross(s,t))/2;
    end
end

getTrianglePointsSimplified.m

function [P_W] = getTrianglePointsSimplified(Triangle,Rule)
    global TriCoeff;
    points = TriCoeff{Rule+1};
    weights = points(:,3)';
    points(:,3) = 1-points(:,1)-points(:,2);
    P_W = zeros(size(points,1),4);
    P\_W(:,1:3)=points*Triangle;
    area = 0.5*norm(cross(Triangle(1,:)-Triangle(2,:),Triangle(1,:)-Triangle(3,:)));
    P\_W(:,4)=weights*area;
end


loadLynessFromTxT.m

function TriCoeff = loadLynessFromTxT(filename)
%LOADLYNESSFROMTXT 加载系数
TriCoeff=cell(22,1);
fp=fopen(filename,'r');
data=textscan(fp,"%f,%f,%f");
fclose(fp);
ALL=[data{1,1},data{1,2},data{1,3}];
[N,~]=size(ALL);
i=1;
while i<N
   rule=ALL(i,1);
   order=ALL(i,2);
   TriCoeff{rule+1,1}=ALL(i+1:i+order,:);
   i=i+order+1;
end
end

추천

출처blog.csdn.net/pythonxxoo/article/details/123650615