Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于使用exp()Python时精度不足,被零除数_Python_Python 3.x_Mathematical Optimization - Fatal编程技术网

由于使用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版本,所以这可能与此有关。