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
.
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 0
pero también puede resultar en 1
al mismo tiempo. Este problema está muy discutido.