ValueError: error de dominio matemático

102

Solo estaba probando un ejemplo de Métodos numéricos en ingeniería con 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)

Cuando lo ejecuto, muestra el siguiente error:

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

Lo he reducido al registro, ya que cuando elimino el registro y agrego una función diferente, funciona. Supongo que se debe a algún tipo de interferencia con la base, no puedo entender cómo. ¿Puede alguien sugerir una solución?

ramanunni.pm
fuente

Respuestas:

131

Su código está haciendo un lognúmero que es menor o igual a cero. Eso es matemáticamente indefinido, por lo que la logfunción de Python genera una excepción. He aquí un ejemplo:

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

Sin saber qué hace su newtonRaphson2función, no estoy seguro de poder adivinar de dónde x[2]proviene el valor no válido , pero espero que esto lo lleve por el camino correcto.

Blckknght
fuente
No veo cómo está haciendo un registro negativo ya que la definición define el conjunto de ecuaciones, es decir, x [0], x [1] y x [2] son ​​variables x, y y z que Newton Raphson usa . Necesita este conjunto de ecuaciones para resolverlo.
ramanunni.pm
1
Además, como estoy diciendo x [2] = 1.0 cuando defino x en el código anterior, log (1) = 0, al menos eso es lo que pensé, tal vez estoy equivocado .. Aunque gracias por la ayuda ..
ramanunni .pm
1
agregue print xa al comienzo de su función f . Podrás ver cómo el solucionador de ecuaciones prueba sucesivamente diferentes valores de x, lo que lleva a tu error.
mtadd
3
En mis casos, el problema fue que el argumento no era negativo, sino exactamente igual a 0, lo que conduce a la misma excepción (lo que podría ser sorprendente para las personas con antecedentes de JS, donde Math.log (0) es simplemente -Infinity)
qbolec
1

Intentas hacer un logaritmo de algo que no es positivo.

Los logaritmos calculan la base después de recibir un número y la potencia a la que se elevó. log(0)significa que algo elevado al poder de 2es 0. Un exponente nunca puede resultar en 0*, lo que significa que log(0)no tiene respuesta, lo que arroja elmath domain error

* Nota: 0^0puede resultar en 0, pero también puede resultar en 1al mismo tiempo. Este problema está muy discutido.

Eric Xue
fuente
1

También puede utilizar math.log1p.

Según la documentación oficial :

math.log1p (x)

Devuelve el logaritmo natural de 1 + x (base e). El resultado se calcula de manera precisa para x cerca de cero.

Puede volver a convertir al valor original utilizando math.expm1que retorna eelevado a la potencia x, menos 1.

Catalina Chircu
fuente
0

obtiene un error de dominio matemático por una de las razones: o está intentando usar un número negativo dentro de la función de registro o un valor cero.

Física3067
fuente