ValueError : 수학 도메인 오류


102

저는 Python으로 엔지니어링의 Numerical Methods 의 예제를 테스트하고있었습니다 .

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)

실행하면 다음 오류가 표시됩니다.

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

로그를 제거하고 다른 기능을 추가하면 작동하므로 로그로 좁혔습니다. 나는 그것이 기지와의 일종의 간섭 때문이라고 생각합니다. 나는 방법을 알 수 없습니다. 누구든지 해결책을 제안 할 수 있습니까?

답변:


131

코드가 log0보다 작거나 같은 숫자를 수행하고 있습니다. 그것은 수학적으로 정의되지 않았으므로 파이썬의 log함수는 예외를 발생시킵니다. 예를 들면 다음과 같습니다.

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

newtonRaphson2함수가 무엇을하는지 모르면 잘못된 x[2]값이 어디에서 오는지 추측 할 수 없지만 이것이 올바른 길로 인도 할 수 있기를 바랍니다.


정의가 방정식 세트를 정의하기 때문에 음의 로그를 수행하는 방법을 알 수 없습니다. 즉, x [0], x [1] 및 x [2]는 Newton Raphson이 사용하는 변수 x, y 및 z입니다. . 해결하려면 이러한 방정식 세트가 필요합니다.
ramanunni.pm 2013

1
또한 위의 코드에서 x를 정의 할 때 x [2] = 1.0이라고 말했듯이, log (1) = 0, 그래도 내가 틀렸을 수도 있습니다. 도움을 주셔서 감사합니다 ..
ramanunni .pm 2013-04-08

1
print x함수 시작 부분에 a 를 추가합니다 . f . 방정식 솔버가 여러 x 값을 연속적으로 시도하여 오류를 발생시키는 방법을 알 수 있습니다.
mtadd 2013

3
제 경우에 문제는 인수가 음수가 아니었지만 정확히 0과 같기 때문에 동일한 예외가 발생합니다 (JS 배경을 가진 사람들에게는 놀랄 수 있으며 Math.log (0)은 단순히 -Infinity 임)
qbolec

1

당신은 양수가 아닌 어떤 것에 대한 로그를하려고합니다.

로그는 숫자가 주어지고 제곱 된 후 밑수를 알아냅니다. log(0)의 힘으로 제기 된 무언가 20입니다. 지수는 0*가 될 수 없습니다 . 이는 log(0)답이 없음 을 의미 하므로math domain error

* 참고 : 0^0결과는 0이지만 동시에 발생할 수도 있습니다 1. 이 문제는 논란이 많다.


1

을 사용할 수도 있습니다 math.log1p.

공식 문서 에 따르면 :

math.log1p (x)

1 + x (밑 e)의 자연 로그를 반환합니다. 결과는 0에 가까운 x에 대해 정확한 방식으로 계산됩니다.

다음을 사용하여 원래의 값으로 다시 변환 할 수 math.expm1있는 반환 e파워 X 제곱 마이너스 1.


0

이유 중 하나에 대해 수학 도메인 오류가 발생합니다. 로그 함수 내에서 음수를 사용하거나 0 값을 사용하려고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.