¿Por qué math.log da como resultado ValueError: error de dominio matemático?

3 minutos de lectura

Avatar de usuario de ramanunni.pm
ramanunni.pm

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?


Ver también: Error de dominio matemático de Python usando la función math.acos para el problema equivalente usando math.acos; error de dominio matemático de python – sqrt para el problema equivalente usando math.sqrt.

Avatar de usuario de Blckknght
Caballero negro

Su código está haciendo un log de un número menor o igual a cero. Eso no está definido matemáticamente, por lo que Python log La función genera una excepción. Aquí hay 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 cuál es tu newtonRaphson2 funciona, no estoy seguro de poder adivinar dónde está el inválido x[2] el valor proviene, pero espero que esto lo lleve por el camino correcto.

  • No veo cómo está haciendo un logaritmo negativo ya que la definición define el conjunto de ecuaciones, es decir, x[0]X[1] yx[2] son las variables x, y y z que utiliza Newton Raphson. Necesita este conjunto de ecuaciones para resolver.

    – ramanunni.pm

    08/04/2013 a las 23:11


  • Además, como digo x[2] = 1.0 cuando defino x en el código anterior, log(1) = 0, al menos eso es lo que pensé, tal vez me equivoque… Gracias por la ayuda…

    – ramanunni.pm

    08/04/2013 a las 23:18


  • Agrega un print x al comienzo de su función F. Verá cómo el solucionador de ecuaciones prueba sucesivamente diferentes valores de x, lo que lleva a su error.

    – mtadd

    08/04/2013 a las 23:28

  • En mis casos, el problema era que el argumento no era negativo, sino exactamente igual a 0, lo que lleva a la misma excepción (lo que podría sorprender a las personas con experiencia en JS, donde Math.log(0) es simplemente -Infinito)

    – qbolec

    3 de agosto de 2016 a las 8:33

También puede usar math.log1p.

De acuerdo con la documentación oficial :

matemáticas.log1p(x)

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

Puede volver a convertir al valor original usando math.expm1 que regresa e elevado a la potencia x, menos 1.

está obteniendo un error de dominio matemático por uno de los motivos: está tratando de usar un número negativo dentro de la función de registro o un valor cero.

Nos enfrentamos a este problema cuando usamos log() o sqrt() de math biblioteca. en este problema “error de dominio matemático”estamos usando un número negativo como (-1 u otro) o un número cero donde no deberíamos usarlo.

Estás tratando de 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 a la potencia de 2 es 0. Un exponente nunca puede resultar en 0*, Lo que significa que log(0) no tiene respuesta, arrojando así el math domain error

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

¿Ha sido útil esta solución?