ValueError: erreur de domaine mathématique

102

Je testais juste un exemple de méthodes numériques en ingénierie avec Python .

from numpy import zeros, array
from math import sin, log
from newtonRaphson2 import *

def f(x):
    f = zeros(len(x))
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
    f[1] = 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0
    f[2] = x[0] + x[1] + x[2] -5.0
    return f

x = array([1.0, 1.0, 1.0])
print newtonRaphson2(f,x)

Lorsque je l'exécute, il affiche l'erreur suivante:

File "example NR2method.py", line 8, in f
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
ValueError: math domain error

Je l'ai réduit au journal car lorsque je supprime le journal et ajoute une fonction différente, cela fonctionne. Je suppose que c'est à cause d'une sorte d'interférence avec la base, je ne peux pas comprendre comment. Quelqu'un peut-il proposer une solution?

ramanunni.pm
la source

Réponses:

131

Votre code fait un logd'un nombre inférieur ou égal à zéro. C'est mathématiquement indéfini, donc la logfonction de Python lève une exception. Voici un exemple:

>>> from math import log
>>> log(-1)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    log(-1)
ValueError: math domain error

Sans savoir ce que fait votre newtonRaphson2fonction, je ne suis pas sûr de pouvoir deviner d'où vient la x[2]valeur invalide , mais j'espère que cela vous mènera sur la bonne voie.

Blckknght
la source
Je ne vois pas comment il fait un log négatif car la définition définit l'ensemble d'équations, c'est-à-dire que x [0], x [1] et x [2] sont des variables x, y et z que Newton Raphson utilise . Il a besoin de cet ensemble d'équations pour être résolu.
ramanunni.pm
1
De plus, comme je dis x [2] = 1.0 quand je définis x dans le code ci-dessus, log (1) = 0, du moins c'est ce que je pensais, peut-être que je me trompe .. Merci pour l'aide cependant ..
ramanunni .pm
1
ajoutez a print xau début de votre fonction f . Vous verrez comment le solveur d'équation essaie successivement différentes valeurs de x, ce qui entraîne votre erreur.
mtadd
3
Dans mon cas, le problème était que l'argument n'était pas négatif, mais exactement égal à 0, ce qui conduit à la même exception (ce qui pourrait être surprenant pour les personnes ayant une expérience JS, où Math.log (0) est simplement -Infinity)
qbolec
1

Vous essayez de faire un logarithme de quelque chose qui n'est pas positif.

Les logarithmes déterminent la base après avoir reçu un nombre et la puissance à laquelle elle a été élevée. log(0)signifie que quelque chose élevé à la puissance de 2est 0. Un exposant ne peut jamais aboutir à 0*, ce qui signifie qu'il log(0)n'a pas de réponse, jetant ainsi lemath domain error

* Remarque: 0^0peut entraîner 0, mais peut également entraîner en 1même temps. Ce problème est largement débattu.

Eric Xue
la source
1

Vous pouvez également utiliser math.log1p.

Selon la documentation officielle :

math.log1p (x)

Renvoie le logarithme népérien de 1 + x (base e). Le résultat est calculé d'une manière qui est précise pour x proche de zéro.

Vous pouvez reconvertir à la valeur d'origine en utilisant math.expm1qui renvoie eà la puissance x, moins 1.

Catalina Chircu
la source
0

vous obtenez une erreur de domaine mathématique pour l'une des raisons: soit vous essayez d'utiliser un nombre négatif dans la fonction de journal, soit une valeur nulle.

Physique3067
la source