Python >> Tutoriel Python >  >> Python

Erreur de domaine Python Math (Comment réparer ce bogue stupide)

Vous pouvez rencontrer un ValueError spécial lorsque vous travaillez avec Python math module.

ValueError: math domain error

Python génère cette erreur lorsque vous essayez de faire quelque chose qui n'est pas mathématiquement possible ou mathématiquement défini.

Pour comprendre cette erreur, regardez la définition du domaine :

"Le domaine d'une fonction est l'ensemble complet des valeurs possibles de la variable indépendante. En gros, le domaine est l'ensemble de toutes les valeurs x (d'entrée) possibles qui donnent une valeur y (de sortie) valide. ” (source)

Le domaine d'une fonction est l'ensemble de toutes les valeurs d'entrée possibles. Si Python lance le ValueError: math domain error , vous avez passé une entrée indéfinie dans le math fonction. Corrigez l'erreur en transmettant une entrée valide pour laquelle la fonction est capable de calculer une sortie numérique.

Voici quelques exemples :

Sqrt d'erreur de domaine mathématique Python

L'erreur de domaine mathématique apparaît si vous passez un argument négatif dans le math.sqrt() fonction. Il est mathématiquement impossible de calculer la racine carrée d'un nombre négatif sans utiliser de nombres complexes. Python ne comprend pas cela et lance un ValueError: math domain error .

Voici un exemple minimal :

from math import sqrt
print(sqrt(-1))
'''
Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 2, in <module>
    print(sqrt(-1))
ValueError: math domain error
'''

Vous pouvez corriger l'erreur de domaine mathématique en utilisant le cmath package permettant la création de nombres complexes :

from cmath import sqrt
print(sqrt(-1))
# 1j

Journal des erreurs du domaine mathématique Python

Le math domain error pour le math.log() apparaît si vous lui transmettez une valeur nulle — le logarithme n'est pas défini pour la valeur 0.

Voici le code d'une valeur d'entrée en dehors du domaine de la fonction logarithme :

from math import log
print(log(0))

La sortie est l'erreur de domaine mathématique :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module>
    print(log(0))
ValueError: math domain error

Vous pouvez corriger cette erreur en passant une valeur d'entrée valide dans le math.log() fonction :

from math import log
print(log(0.000001))
# -13.815510557964274

Cette erreur peut parfois apparaître si vous y transmettez un très petit nombre - le type float de Python ne peut pas exprimer tous les nombres. Pour passer une valeur "proche de 0", utilisez le Decimal module avec une plus grande précision, ou passez un très petit argument d'entrée tel que :

math.log(sys.float_info.min)

Acos d'erreur de domaine mathématique Python

Le math domain error pour le math.acos() apparaît si vous lui transmettez une valeur pour laquelle elle n'est pas définie - arccos n'est défini que pour les valeurs comprises entre -1 et 1.

Voici le mauvais code :

import math
print(math.acos(2))

La sortie est l'erreur de domaine mathématique :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module>
    print(math.acos(2))
ValueError: math domain error

Vous pouvez corriger cette erreur en passant une valeur d'entrée valide entre [-1,1] dans le math.acos() fonction :

import math
print(math.acos(0.5))
# 1.0471975511965979

Erreur de domaine Python Math Asin

Le math domain error pour le math.asin() apparaît si vous lui transmettez une valeur pour laquelle elle n'est pas définie - arcsin n'est défini que pour les valeurs comprises entre -1 et 1.

Voici le code erroné :

import math
print(math.asin(2))

La sortie est l'erreur de domaine mathématique :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module>
    print(math.asin(2))
ValueError: math domain error

Vous pouvez corriger cette erreur en passant une valeur d'entrée valide entre [-1,1] dans le math.asin() fonction :

import math
print(math.asin(0.5))
# 0.5235987755982989

Erreur de domaine Python Math Pow

Le math domain error pour le math.pow(a,b) La fonction pour calculer a**b apparaît si vous lui transmettez une valeur de base négative et essayez d'en calculer une puissance négative. La raison pour laquelle il n'est pas défini est que tout nombre négatif à la puissance 0,5 serait le nombre carré - et donc, un nombre complexe. Mais les nombres complexes ne sont pas définis par défaut en Python !

import math
print(math.pow(-2, 0.5))

La sortie est l'erreur de domaine mathématique :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\Finxter\Blog\code.py", line 3, in <module>
    print(math.pow(-2, 0.5))
ValueError: math domain error

Si vous avez besoin d'un nombre complexe, a b doit être réécrit en e b ln a . Par exemple :

import cmath
print(cmath.exp(0.5 * cmath.log(-2)))
# (8.659560562354932e-17+1.414213562373095j)

Vous voyez, c'est un nombre complexe !

Erreur de domaine mathématique NumPy — np.log(x)

import numpy as np
import matplotlib.pyplot as plt

# Plotting y = log(x)
fig, ax = plt.subplots()
ax.set(xlim=(-5, 20), ylim=(-4, 4), title='log(x)', ylabel='y', xlabel='x')
x = np.linspace(-10, 20, num=1000)
y = np.log(x)

plt.plot(x, y)

C'est le graphique de log(x) . Ne vous inquiétez pas si vous ne comprenez pas le code, le plus important est le point suivant. Vous pouvez voir que log(x) tend vers l'infini négatif lorsque x tend vers 0. Ainsi, il est mathématiquement inutile de calculer le log d'un nombre négatif. Si vous essayez de le faire, Python génère une erreur de domaine mathématique.

>>> math.log(-10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error