Python WeChat 注文アプレット コース ビデオ
https://edu.csdn.net/course/detail/36074
Pythonによる実践的な定量取引財務管理システム
https://edu.csdn.net/course/detail/35475
数値計算: 三角積分
この本は前章「ガウス・レーランドの積分公式」からの続きです。
**要件:** 指定された空間三角形 Δ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_{\デルタ ABC}f(x,y,z)\text dS。
**解決策:** Triangle_lyness_rule で与えられた積分法を参照してください。詳細はわかりませんが、考え方はガウス積分に似ています。積分面上の積分点と係数の重みを計算して積分します。
三角形積分点と積分重み計算
トライアングルリネスの法則
トライアングル_lyness_ruleは、標準三角形の係数ポイントの位置と重み係数をさまざまな次数で与えます。例えば下図は、Rule=10Rule=10Rule=10の場合の積分点の位置と重み係数を示しています。次の表は、積分精度 PrecisionPrecisionPrecision 積分ポイントの数 orderorderorder と、異なる RuleRuleRule で積分ポイントに三角形 centercentercentercenter が含まれるかどうかを示します。
ルール | 注文 | 精度 | 中心 |
---|---|---|---|
0 | 1 | 1 | はい |
1 | 3 | 2 | いいえ |
2 | 4 | 2 | はい |
3 | 4 | 3 | はい |
4 | 7 | 3 | はい |
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 節点の形状関数が得られ、残りの手順は「ガウス・レーランドの積分公式」と同様です。
⎧⎩⎨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
ロードLynessFromTxT.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