J'essaie d'exécuter une équation quadratique en python. Cependant, il continue à me donner une erreur "RuntimeWarning: valeur non valide rencontrée dans sqrt".
Voici mon code:
import numpy as np
a = 0.75 + (1.25 - 0.75)*np.random.randn(10000)
print a
b = 8 + (12 - 8)*np.random.randn(10000)
print b
c = -12 + 2*np.random.randn(10000)
print c
x0 = (-b - np.sqrt(b**2 - (4*a*c)))/(2 * a)
print x0
Votre suggestion d'expert sera extrêmement utile. Merci d'avance
Ce n'est pas lié à 100% à Python. Vous ne pouvez pas calculer la racine carrée d'un nombre négatif (lorsqu'il s'agit de nombres réels).
Vous n'avez pris aucune précaution lorsque b**2 - (4*a*c)
est un nombre négatif.
>>> import numpy as np
>>>
>>> np.sqrt(4)
2.0
>>> np.sqrt(-4)
__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan
Testons si vous avez des valeurs négatives:
>>> import numpy as np
>>>
>>> a = 0.75 + (1.25 - 0.75) * np.random.randn(10000)
>>> b = 8 + (12 - 8) * np.random.randn(10000)
>>> c = -12 + 2 * np.random.randn(10000)
>>>
>>> z = b ** 2 - (4 * a * c)
>>> print len([_ for _ in z if _ < 0])
71
Si vous souhaitez effectuer une analyse complexe (avec des nombres imaginaires définis par sqrt (-1)), vous pouvez importer cmath et utiliser cmath.sqrt (-1) au lieu de numpy.sqrt (-1).
Par exemple, lorsque je calcule l'indice de réfraction des matériaux à partir de la permittivité et de la perméabilité (par définition, j est impliqué), j'écris des fonctions en python en tant que telles:
def n(f):
y = cmath.sqrt(mu1f(f) - j*mu2f(f)) * (e1f(f) - j*e2f(f))
return y.real
Où e1f etc. sont des fonctions d'interpolation définies précédemment, qui sont toutes fonction de la fréquence incidente f. La résultante est en elle-même une valeur complexe, l'indice complexe de réfraction, mais je ne m'intéresse souvent que dans la partie réelle (l'indice de réfraction), c'est donc ce qui est renvoyé.
J'espère que cela t'aides