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?
python
runtime-error
logarithm
ramanunni.pm
fuente
fuente
print x
a 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.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 de2
es0
. Un exponente nunca puede resultar en0
*, lo que significa quelog(0)
no tiene respuesta, lo que arroja elmath domain error
* Nota:
0^0
puede resultar en0
, pero también puede resultar en1
al mismo tiempo. Este problema está muy discutido.fuente
También puede utilizar
math.log1p
.Según la documentación oficial :
Puede volver a convertir al valor original utilizando
math.expm1
que retornae
elevado a la potencia x, menos 1.fuente
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.
fuente