问题
I was just testing an example from Numerical Methods in Engineering with 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)
When I run it, it shows the following 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
I have narrowed it down to the log as when I remove log and add a different function, it works. I assume it is because of some sort of interference with the base, I can't figure out how. Can anyone suggest a solution?
回答1:
Your code is doing a log
of a number that is less than or equal to zero. That's mathematically undefined, so Python's log
function raises an exception. Here's an example:
>>> from math import log
>>> log(-1)
Traceback (most recent call last):
File "<pyshell#59>", line 1, in <module>
log(-1)
ValueError: math domain error
Without knowing what your newtonRaphson2
function does, I'm not sure I can guess where the invalid x[2]
value is coming from, but hopefully this will lead you on the right track.
回答2:
You are trying to do a logarithm of something that is not positive.
Logarithms figure out the base after being given a number and the power it was raised to. log(0)
means that something raised to the power of 2
is 0
. An exponent can never result in 0
*, which means that log(0)
has no answer, thus throwing the math domain error
*Note: 0^0
can result in 0
, but can also result in 1
at the same time. This problem is heavily argued over.
来源:https://stackoverflow.com/questions/15890503/valueerror-math-domain-error