Génération automatique de points d'intégration et de poids pour les triangles et les tétraèdres

12

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.

David Ketcheson
la source
1
Il y a un moyen plus facile de faire vos règles en quadrature de Gauss-Legendre dans Mathematica : {points, weights} = MapThread[Map, {{2 # - 1 &, 2 # &}, Most[NIntegrate`GaussRuleData[n, prec]]}].
JM
En tout état de cause: avez - vous vu cela ?
JM
@JM, votre méthode proposée ci-dessus ne fonctionne malheureusement pas pour prec = Infinity; mais merci pour ça aussi.
2
Dans ce cas, voici une méthode qui fonctionne, en raison de Golub et Welsch: 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}]].
JM
1
Voici l'article de Golub et Welsch. Je vais fouiller dans mes papiers et voir s'il y a quelque chose pour les simplifications ...
JM

Réponses:

3

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.

James Custer
la source
C'est une idée intéressante, il semble que pour n = 2 cela nécessite 4 points, pour la référence de la littérature typique pour les triangles pour n = 2, 3 points sont donnés. Sais tu quelque chose à propos de cela?
Cela vient du fait qu'ils utilisent une cartographie du triangle au carré. Je ne peux rien dire de plus car je ne travaille pas avec des triangles (j'utilise des quadrilatères), donc je ne sais pas ce qui se fait habituellement dans la pratique. Je viens de trouver le papier et j'ai pensé que cela semblait être une chose assez simple à faire.
James Custer
en effet, c'est assez simple et je vais voir ce que suggèrent les autres articles, mais la simplicité pour celui-ci et l'élégance d'utiliser quelque chose que j'ai déjà sont un plus pour celui-ci. L'inconvénient est alors l'évaluation de la fonction supplémentaire. Merci en tout cas.
un autre inconvénient est que les points ne sont pas symétriques.