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