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?

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.


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.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.