как решить ошибку переполнения: ошибка математического диапазона - PullRequest
0 голосов
/ 21 января 2019

Я получаю ошибку переполнения

import numpy as np

pi = np.pi

from scipy.integrate import quad
from math import exp

hbar = 1.055e-34
boltz = 1.381e-23
c = 2.998e8

def z(x):
    return (x**3)/(exp(x)-1)

B=quad(z,0,np.inf)       
A= ((boltz**4)*B)/(4*(pi**2)*(c**2)*(hbar**3))

print (A) 

Это дает мне ошибку переполнения в строке 11, т.е. return (x**3)/(exp(x)-1)

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы можете использовать np.exp вместо math.exp: оно выдаст предупреждение для больших чисел и вернет np.inf (что приводит к 1/np.inf = 0) вместо повышения OverFlowError

def z(x):
    return (x**3)/(np.exp(x)-1)    #replace math.exp by np.exp

B, err =quad(z,0,np.inf)  # add the err, or use B=quad(...)[0] as quad will also return the integration error
A= ((boltz**4)*B)/(4*(pi**2)*(c**2)*(hbar**3))
print(A)
>> 5.668949306250541e-08
0 голосов
/ 21 января 2019

Вы достигли точности машины, и питон сходит с ума.

>>> def z(x):
...     return (x**3)/(exp(x)-1)
...
>>> z(709)
4.336616682334302e-300
>>> z(710)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in z
OverflowError: math range error

Просто интегрируйте до ~ 700, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...