Habituellement, on consulte un document ou un livre pour trouver des points d'intégration et des poids pour le triangle unitaire et les tétraèdres. Je recherche une méthode pour calculer automatiquement ces points et ces poids. L' exemple de code Mathematica suivant calcule les poids et points d'intégration pour les éléments de ligne unitaire (quad / hexaèdre):
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])}
Je recherche un article / livre qui décrit algorithmiquement comment cela se fait pour les triangles et / ou les tétraèdres. Quelqu'un peut-il me signaler des informations à ce sujet? Merci.
symbolic-computation
reference-request
David Ketcheson
la source
la source
{points, weights} = MapThread[Map, {{2 # - 1 &, 2 # &}, Most[NIntegrate`GaussRuleData[n, prec]]}]
.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}]]
.Réponses:
L' Encyclopaedia of Cubature Formulas possède une longue liste de techniques à cet effet et des références associées.
la source
Voici un article http://journal.library.iisc.ernet.in/vol200405/paper6/rathod.pdf qui décrit comment mapper le triangle unitaire au carré standard 2 afin de calculer les poids et les points d'échantillonnage pour le triangle en termes de points de Gauss-Legendre pour le carré standard 2.
la source