ValueError: erro de domínio matemático

102

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?

ramanunni.pm
fonte

Respostas:

131

Seu código está fazendo a logde um número que é menor ou igual a zero. Isso é matematicamente indefinido, então a logfunção do Python levanta uma exceção. Aqui está um exemplo:

>>> from math import log
>>> log(-1)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    log(-1)
ValueError: math domain error

Sem saber o que sua newtonRaphson2função faz, não tenho certeza se posso adivinhar de onde x[2]vem o valor inválido , mas espero que isso o leve ao caminho certo.

Blckknght
fonte
Não vejo como é fazer um log negativo já que a definição está definindo o conjunto de equações, ou seja, x [0], x [1] e x [2] são as variáveis ​​x, y e z que Newton Raphson usa . Ele precisa desse conjunto de equações para resolver.
ramanunni.pm
1
Além disso, como estou dizendo x [2] = 1.0 quando defino x no código acima, log (1) = 0, pelo menos é o que eu pensei, talvez eu esteja errado .. Mas obrigado pela ajuda ..
ramanunni .pm
1
adicione print xa 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.
mtadd de
3
Em meus casos, o problema era que o argumento não era negativo, mas exatamente igual a 0, o que leva à mesma exceção (o que pode ser surpreendente para pessoas com experiência em JS, onde Math.log (0) é simplesmente -Infinito)
qbolec
1

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 de 2é 0. Um expoente nunca pode resultar em 0*, o que significa que log(0)não tem resposta, lançando assim omath domain error

* Observação: 0^0pode resultar em 0, mas também pode resultar em 1ao mesmo tempo. Este problema é fortemente discutido.

Eric Xue
fonte
1

Você também pode usar math.log1p.

De acordo com a documentação oficial :

math.log1p (x)

Retorne o logaritmo natural de 1 + x (base e). O resultado é calculado de forma precisa para x próximo de zero.

Você pode converter de volta ao valor original usando math.expm1que retorna eelevado à potência x, menos 1.

Catalina Chircu
fonte
0

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.

Physics3067
fonte