L'intégration numérique en C++
J'ai besoin d'intégrer une fonction de deux variables).
Je sais que je peux le faire en utilisant théorème de Fubini d'intégrer une fonction de variable, puis à l'aide de méthodes numériques telles que la Rectangle méthode ou la Trapézoïdale règle.
Mais existe-il des pré-construit fonctions à le faire dans C++? J'ai besoin d'intégrer plus de l'unité R2
triangle ((0,0), (1,0), (0,1))
.
Pas de fonctions internes pour ce faire. Mais ce n'est pas très difficile d'écrire du code. J'ai utilisé de la "double check" mon intégration des résultats par runing trapézoïdale un sur ma calculatrice à l'École, et je me le taper en cours de l'essai (sinon ce serait de la triche)
Vous souhaitez intégrer numériquement ∫∫f(x,y)dydx que y varie de 0 à (1-x) et x varie de 0 à 1?
Oui, Hal Canaries. Il n'existe pas de base de la bibliothèque pour faire comme cmath ? Bien sûr, je peux écrire le code moi-même, mais j'étais presque sûr il y a des bibliothèques pour le faire...
Pas partie de la norme bibliothèques. Allais-je écrire à l'aide d'un trapèze de la règle et de voir comment elle est exacte. Il existe de meilleures façons (quadrature de Gauss), mais de voir si la règle est simple assez bon pour vous.
Vous souhaitez intégrer numériquement ∫∫f(x,y)dydx que y varie de 0 à (1-x) et x varie de 0 à 1?
Oui, Hal Canaries. Il n'existe pas de base de la bibliothèque pour faire comme cmath ? Bien sûr, je peux écrire le code moi-même, mais j'étais presque sûr il y a des bibliothèques pour le faire...
Pas partie de la norme bibliothèques. Allais-je écrire à l'aide d'un trapèze de la règle et de voir comment elle est exacte. Il existe de meilleures façons (quadrature de Gauss), mais de voir si la règle est simple assez bon pour vous.
OriginalL'auteur user2370139 | 2013-05-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le Bibliothèque Scientifique GNU, qui prend en charge de nombreux "analyse Numérique" les fonctions, y compris l'intégration.
Très simple exemple d'intégration le manuel est juste quelques lignes de code:
OriginalL'auteur Wagner Patriota
Autant que je sache, il n'existe pas de fonctions du type que vous cherchez dans la bibliothèque standard. Voici une mise en œuvre de l':
L'étendue de forme trapézoïdale à la règle.
Un certain nombre de quadrature élémentaire algorithmes nécessitent l'ajout d'
les étapes successives de raffinement. Il est commode pour encapsuler cette fonctionnalité dans un
Quadrature
structure:Puis le
Trapzd
la structure est dérivée à partir de ce comme suit:Utilisation:
La
Trapzd
structure pourrait être utilisé de plusieurs façons. L'la plus simple et la plus grossière est d'intégrer une fonction de l'étendue de forme trapézoïdale de la règle où vous savez à l'avance le nombre d'étapes que vous le souhaitez. Si vous
voulez
2^M + 1
, vous pouvez accomplir cela en le fragment:avec la réponse retournée comme
val
. IciFtor
est un foncteur contenant la fonction à intégrer.Bonus:
Beaucoup mieux, bien sûr, est d'affiner la forme trapézoïdale de la règle jusqu'à un certain
degré de précision qui a été réalisé. Une fonction est la suivante:
Typedefs.
OriginalL'auteur Ziezi
Je recommanderais quadrature de Gauss et de forme linéaire des fonctions:
http://www.mathworks.com/matlabcentral/fileexchange/9230-gaussian-quadrature-for-triangles
http://www.wolframalpha.com/input/?i=gaussian+quadrature+triangle
http://www.cs.rpi.edu/~flaherje/pdf/fea6.pdf
OriginalL'auteur duffymo
Vous pouvez consulter le coup de pouce de Quadrature et de la Différenciation de la Bibliothèque. En particulier, ils fournissent une version de la Règle du Trapèze:
https://www.boost.org/doc/libs/1_69_0/libs/math/doc/html/math_toolkit/trapezoidal.html
La Quadrature/Différenciation de la Bibliothèque est très bien écrit et compatible avec le C++ moderne, en ce qu'il est possible d'utiliser une expression lambda ou un objet de fonction pour la fonction à intégrer. J'ai été opérationnel très rapidement.
Voici un exemple d'approximation de pi, par l'approximation de l'intégrale des 4/(1 + x^2), x = 0 à x = 1, en mettant l'intégrande comme une expression lambda.
J'ai donné deux exemples, l'un utilisant les paramètres par défaut pour la discrétisation de la plage de l'intégration et de convergence, et la seconde à l'aide de paramètres personnalisés.
Mes résultats (juste de faire une copie de la sortie de l'écran):
OriginalL'auteur djhanson