Eu estava testando um exemplo de Métodos Numéricos em Engenharia com 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)
Quando eu o executo, ele mostra o seguinte erro:
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
Eu reduzi para o log, pois quando removo o log e adiciono uma função diferente, ele funciona. Presumo que seja por causa de algum tipo de interferência com a base, não consigo descobrir como. Alguém pode sugerir uma solução?
python
runtime-error
logarithm
ramanunni.pm
fonte
fonte
print x
a ao início de sua função f . Você verá como o solucionador de equações tenta sucessivamente diferentes valores de x, levando ao seu erro.Você está tentando fazer um logaritmo de algo que não é positivo.
Os logaritmos calculam a base depois de receber um número e a potência para a qual foi elevado.
log(0)
significa que algo elevado à potência de2
é0
. Um expoente nunca pode resultar em0
*, o que significa quelog(0)
não tem resposta, lançando assim omath domain error
* Observação:
0^0
pode resultar em0
, mas também pode resultar em1
ao mesmo tempo. Este problema é fortemente discutido.fonte
Você também pode usar
math.log1p
.De acordo com a documentação oficial :
Você pode converter de volta ao valor original usando
math.expm1
que retornae
elevado à potência x, menos 1.fonte
você está recebendo um erro de domínio matemático por um dos motivos: ou você está tentando usar um número negativo dentro da função de log ou um valor zero.
fonte