由于使用exp()Python时精度不足,被零除数
我用一个二等分算法来求函数的最大值 这是我的密码:由于使用exp()Python时精度不足,被零除数,python,python-3.x,mathematical-optimization,Python,Python 3.x,Mathematical Optimization,我用一个二等分算法来求函数的最大值 这是我的密码: from math import exp h = 6.62606876e-34 c = 2.99792458e8 k = 1.3806504e-23 T = 7000 epsilon = 1.e-10 def fct(lam) : return 2*h**2*c**3*exp(h*c/(lam*k*T))/(k*T*lam**7*(exp(h*c/(lam*k*T)) - 1)) - 10*c**2*h/(lam**6*(exp(h
from math import exp
h = 6.62606876e-34
c = 2.99792458e8
k = 1.3806504e-23
T = 7000
epsilon = 1.e-10
def fct(lam) :
return 2*h**2*c**3*exp(h*c/(lam*k*T))/(k*T*lam**7*(exp(h*c/(lam*k*T)) - 1)) - 10*c**2*h/(lam**6*(exp(h*c/(lam*k*T)) - 1))
lam1 = 100.e-9
lam2 = 1000.e-9
delta = lam2 - lam1
f1 = fct(lam1)
f2 = fct(lam2)
while delta > epsilon :
lamm = 0.5*(lam1 + lam2)
fm = fct(lamm)
f2=fct(lam2)
if fm*f2 > 0 :
lam2 = lamm
else :
lam1 = lamm
delta = lam2 - lam1
print('racine de la fonction: {}+/-{}'.format(lamm,delta))
问题是,由于浮点的精度有限,当计算线fm=fct(lamm)时,我得到了零误差除法
如何解决这个问题?我认为用python进行数学运算的最佳选择是使用众多数学处理库中的一个。针对浮点问题,建议使用
mpmath
bigfloat
可能就足够了numpy
也有类似于float128
的功能
到处找你喜欢的东西。我没有一个很好的答案。一种方法是重新计算你的单位,比如说设置c=1,如果你处理的是大量的数据,那么进行计算,然后在无标度系统中表达你的答案。如果你处理的是小单位,你必须做一些类似的事情
我刚刚发现的另一个解决方案是mpmath模块,它声称能够进行高达1000个精度单位的计算!他们的网站是,我希望这对你有帮助 一种可能性是将代码转换为对超越函数(示例中的exp)以外的所有函数使用精确算术,例如使用。当然,超越函数的输入和输出需要转换。嗯,我不能重现你的错误,一切似乎都在工作。。。我现在运行的是2.7版本,所以这可能与此有关。