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?

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.


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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.