ValueError: math domain error

PythonRuntime ErrorLogarithm

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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.

Solution 2 - Python

You may also use math.log1p.

According to the official documentation :

> math.log1p(x)

> Return the natural logarithm of 1+x (base e). The result > is calculated in a way which is accurate for x near zero.

You may convert back to the original value using math.expm1 which returns e raised to the power x, minus 1.

Solution 3 - Python

you are getting math domain error for either one of the reason : either you are trying to use a negative number inside log function or a zero value.

Solution 4 - Python

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.

Solution 5 - Python

We face this problem when we use log() or sqrt() from math library. In this problem “math domain error”, we are using a negative number like (-1 or another) or a zero number where we should not be use.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionramanunni.pmView Question on Stackoverflow
Solution 1 - PythonBlckknghtView Answer on Stackoverflow
Solution 2 - PythonCatalina ChircuView Answer on Stackoverflow
Solution 3 - PythonPhysics3067View Answer on Stackoverflow
Solution 4 - PythonEric XueView Answer on Stackoverflow
Solution 5 - PythonMohammad Al JadallahView Answer on Stackoverflow