Runtimewarning: Overflow Encountered In Cosh -- Python. What Does This Mean?
I'm running the following calculation: N = 2**15 dx = 0.1 x = np.arange(-N/2,N/2) u0 = np.zeros([N, 1]) L = N * dx x0 = x[1] + 2 * delta delta = 15 while x0 < L - delta: l
Solution 1:
cosh grows very large:
In [70]: np.cosh(2**10)
<ipython-input-70-c4511154ec1e>:1: RuntimeWarning: overflow encountered incosh
np.cosh(2**10)
Out[70]: inf
Why is your x so wide? For most of the range, the inverse of this cosh will be 0.
In [72]: N=2**15; x = np.arange(-N/2,N/2)
In [73]: len(x)
Out[73]: 32768In [74]: r =1/(np.cosh(x)**2)
<ipython-input-74-404fbe3be390>:1: RuntimeWarning: overflow encountered in cosh
r =1/(np.cosh(x)**2)
<ipython-input-74-404fbe3be390>:1: RuntimeWarning: overflow encountered in square
r =1/(np.cosh(x)**2)
In [75]: r[:10]
Out[75]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [77]: np.sum(r<1e-16)
Out[77]: 32729Look at a +-20 range for x
In [88]: x = np.arange(-20,20)
In [89]: r = 1/(np.cosh(x)**2)
In [90]: r
Out[90]:
array([1.69934170e-17, 1.25565312e-16, 9.27809132e-16, 6.85563373e-15,
5.06566622e-14, 3.74304919e-13, 2.76576004e-12, 2.04363561e-11,
...
1.00000000e+00, 4.19974342e-01, 7.06508249e-02, 9.86603717e-03,
...
1.51005382e-10, 2.04363561e-11, 2.76576004e-12, 3.74304919e-13,
5.06566622e-14, 6.85563373e-15, 9.27809132e-16, 1.25565312e-16])
suppressing the warnings
In [148]: x=np.array([-2**15,-2**4,0,2**4,2**15])
In [155]: np.cosh(x)
<ipython-input-155-1e743139b88e>:1: RuntimeWarning: overflow encountered in cosh
np.cosh(x)
Out[155]:
array([ inf, 4.44305526e+06, 1.00000000e+00, 4.44305526e+06,
inf])
In [156]: 1/(np.cosh(x)**2)
<ipython-input-156-5cf76600c0c7>:1: RuntimeWarning: overflow encountered in cosh
1/(np.cosh(x)**2)
Out[156]:
array([0.00000000e+00, 5.06566622e-14, 1.00000000e+00, 5.06566622e-14,
0.00000000e+00])
The warning does not prevent you from getting useful values. It is a warning, not an error.
But can suppress the warning. On way is with errstate:
In [157]: with np.errstate(over='ignore'):
...: y =1/(np.cosh(x)**2)
...:
In [158]: y
Out[158]:
array([0.00000000e+00, 5.06566622e-14, 1.00000000e+00, 5.06566622e-14,
0.00000000e+00])
np.seterr can also be used, but it will change handling for the whole script, not just this context. So the with np.errstate is preferred.
Do take time to read the docs.
In [159]: np.geterr()
Out[159]: {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
There is also a warnings module
Post a Comment for "Runtimewarning: Overflow Encountered In Cosh -- Python. What Does This Mean?"