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?
python
runtime-error
logarithm
ramanunni.pm
la source
la source
print x
au 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.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 de2
est0
. Un exposant ne peut jamais aboutir à0
*, ce qui signifie qu'illog(0)
n'a pas de réponse, jetant ainsi lemath domain error
* Remarque:
0^0
peut entraîner0
, mais peut également entraîner en1
même temps. Ce problème est largement débattu.la source
Vous pouvez également utiliser
math.log1p
.Selon la documentation officielle :
Vous pouvez reconvertir à la valeur d'origine en utilisant
math.expm1
qui renvoiee
à la puissance x, moins 1.la source
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.
la source