# Python pour le calcul scientifique/Fonctions mathématiques générales

Par défaut, Python ne propose que les quatre opérations (+, -, * et /), la division euclidienne (//, et % pour le reste) et l'élévation à la puissance (**). Le module NumPy fournit les opérations mathématiques avancées. En particulier, il propose des fonctions « universelles » (ufunc) qui peuvent travailler directement sur des matrices.

## Importer le module

Toutes les fonctions évoquées dans ce chapitre supposent l'import du module NumPy sous le nom « np » :

## Fonctions universelles de base

On retrouve les quatre opérations mais sous la forme de fonctions de deux variables :
* np.add(x1, x2) : x$_1$ + x$_2$ ;
* np.subtract(x1, x2) : x$_1$ – x$_2$ ;
* np.multiply(x1, x2) : x$_1$ × x$_2$ ;
* np.divide(x1, x2), np.true_divide(x1, x2) : x$_1$ ÷ x$_2$.
Les variables x$_1$ et x$_2$ peuvent être des matrices de même dimension, les opérations sont alors faites élément par élément. Ces fonctions disposent en outre de méthodes, notamment de la méthode .accumulate qui cumule les opérations, par exemple
Cette méthode existe d'ailleurs pour toutes les fonctions universelles de deux variables.
Les autres opérations de base sont :
* np.negative(x) : –x ;
* np.reciprocal(x) : 1 / x ;
* np.mod(x1, x2), np.remainder(x1, x2) : reste de la division euclidienne x$_1$ ÷ x$_2$ ;
* np.absolute(x), np.abs(x) : |x| ;
* np.rint(x) : arrondit à l'entier le plus proche ;
* np.floor(x), np.ceil(x) : arrondit respectivement à l'entier directement inférieur et supérieur ;
* np.trunc(x) : tronque les décimales, partie entière, E(x) ;
* np.sign(x) : signe de x (+1 ou –1) ;
* np.gcd(x1, x2) : PGCD ;
* np.lcm(x1, x2) : PPCM ;
* np.mean([x1, x2, …, xn]) : moyenne des x$_i$ ;
* np.average([x1, x2, …, xn], weights=[m1, m2, …, mn]) : moyenne des x$_i$ pondérée par mes masses m$_i$.
Notez que les valeurs renvoyées par np.rint, np.floor, np.ceil et np.trunc sont des réels à virgule flottante (float) bien que les valeurs soient entières. Pour avoir des nombres de types « entier » (integer), il faut utiliser la fonction int : int(np.rint)…

## Autres fonctions universelles

* np.power(x1, x2) : x$_1$$^{x2}$ ;
* np.square(x) : x$^2$ ;
* np.sqrt(x) : ${\sqrt {x}}$ ;
    si x est une matrice de réels, alors le résultat doit être réel, les valeurs négatives renvoient un NaN ; si x contient au moins un nombre complexe, alors le résultat est complexe, par exemple :
* np.cbrt(x) : ${\sqrt[{3}]{x}}$ ;
* np.exp(x) : exp(x), e$^x$ ;
* np.exp2(x) : 2$^x$ ;
* np.expm1(x) : exp(x) – 1 ;
* np.log(x) : ln(x), logarithme népérien ;
* np.log2(x) : logarithme en base 2 ;
* np.log10(x) : log(x), logarithme en base 10 ;
* np.log1p(x) : ln(1 + x) ;
* np.conj(z) : z, conjugué complexe ;
* np.heavyside(x1, x2) : fonction marche, vaut 0 si x$_1$ < 0, 1 si x$_1$ > 0, et x$_2$ si x$_1$ = 0.

## Autres fonctions
### Fonctions trigonométriques

* np.sin(x) : fonction sinus trigonométrique ;
* np.cos(x) : fonction cosinus trigonométrique ;
* np.tan(x) : fonction tangente trigonométrique ;
* np.arcsin(x) : fonction sinus trigonométrique inverse ;
* np.arccos(x) : fonction cosinus trigonométrique inverse ;
* np.arctan(x) : fonction tangente trigonométrique inverse ;
* np.arctan2(x1,x2) : fonction tangente trigonométrique inverse de $x1/x2$ sélectionnant le bon quadrant selon les deux valeurs.

### Fonctions hyperboliques

* np.sinh(x) : fonction sinus hyperbolique ;
* np.cosh(x) : fonction cosinus hyperbolique ;
* np.tanh(x) : fonction tangente hyperbolique ;
* np.arcsinh(x) : fonction sinus hyperbolique inverse ;
* np.arccosh(x) : fonction cosinus hyperbolique inverse ;
* np.arctanh(x) : fonction tangente hyperbolique inverse.

## Précision

La précision de la représentation des réels en virgule flottante (float) est donnée par :
    np.finfo(float).eps
Python possède une commande de base pour les arrondis : round(x, n) arrondit le nombre x à n chiffres après la virgule. Si n = 0 ou si ce paramètre est omis, il arrondit à l'entier.
Numpy dispose des fonctions suivantes, qui s'appliquent terme par terme sur des matrices :
* np.round(x, n) : arrondit au plus proche ; comme la fonction de base de Python ;
* np.fix(x, n) : arrondit à l'entier vers zéro ;
* np.ceil(x, n) : arrondit à l'entier supérieur ;
* np.floor(x, n) : arrondit à l'entier inférieur.
Les matrices (np.array([…]) ont une méthode round(n) pour arrondir chaque élément à la ne décimale, par exemple

## Fonctions booléennes

Les fonctions booléennes sont incluses dans le langage de base :
* x or y : ou ;
* x and y : et ;
* not x : non ;
* all([x, y, z]) : et appliqué à une liste ;
* any([x, y, z]) : ou appliqué à une liste.
Les fonctions all et any renvoient un seul et unique booléen. Si l'on veut appliquer un opérateur élément par élément à toute une liste, par exemple prendre la négation de chaque élément de la liste, il faut utiliser les fonctions de type numpy.logical_xxx de la bibliothèque NumPy.

## Notes et références

* ↑ Voir Découverte de Python et de Jupyter > Commandes élémentaires.
* (en) « Universal functions (ufunc) », sur Numpy and Scipy Documentation (consulté le 18 mai 2019)
Premiers programmes < ↑ > Éléments de programmation