Genellikle birim üçgen ve tetrahedra için entegrasyon noktaları ve ağırlıkları bulmak için bir kağıt veya kitaba danışılır. Bu tür noktaları ve ağırlıkları otomatik olarak hesaplamak için bir yöntem arıyorum. Aşağıdaki Mathematica kod örneği, birim satırı (dörtlü / altı yüzlü) elemanları için entegrasyon ağırlıklarını ve noktalarını hesaplar:
unitGaussianQuadraturePoints[points_] :=
Sort[x /.
Solve[Evaluate[LegendreP[points, x] == 0], {x}], !
OrderedQ[N[{#1, #2}]] &];
unitGaussianQuadratureWeights[points_] :=
Module[{gps, f, int, integr, vars, eqns},
gps = unitGaussianQuadraturePoints[points];
f[0, 0] := 1;
f[0., 0] := 1.;
f[x_, n_] := x^n;
int = Integrate[f[x, #], x] & /@ Range[0, points - 1];
integr = Subtract @@@ (int /. x :> {1, -1});
vars = Table[Unique[c], {Length[gps]}];
eqns =
Table[Plus @@ Thread[Times[vars, f[#, i - 1] & /@ gps]] ==
integr[[i]], {i, points}];
Return[(vars /. Solve[eqns, vars])];];
unitGaussianQuadratureWeights[2]
{{1, 1}}
unitGaussianQuadraturePoints[2]
{1/Sqrt[3], -(1/Sqrt[3])}
Bunun üçgenler ve / veya tetrahedra için nasıl yapıldığını algoritmik olarak açıklayan bir kağıt / kitap arıyorum. Birisi beni bu konuda bazı bilgilere yönlendirebilir mi? Teşekkürler.
Transpose[MapAt[2(First /@ #)^2 &, Eigensystem[SparseArray[{Band[{2, 1}] -> #, Band[{1, 2}] -> #}, {n, n}]], {2}]] &[Table[k/Sqrt[(2 k - 1)(2 k + 1)], {k, n - 1}]]
.
{points, weights} = MapThread[Map, {{2 # - 1 &, 2 # &}, Most[NIntegrate`GaussRuleData[n, prec]]}]
.