使用exp()Python,由于精度不足而除以零

时间:2016-01-23 20:47:04

标签: python python-3.x mathematical-optimization

我正在使用bissection算法来查找函数的最大值。

这是我的代码:

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)时,我得到零除错误。

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

我认为在python中进行数学运算最好的选择是使用众多数学处理库中的一个。 https://stackoverflow.com/a/13442742/2534876建议Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: It's not possible to set a space equal to the width or height of a view. Perhaps you want to use a view as a spacer? [view1][spacer(==view1)][view2] |-someLabel-space(==viewWidth)-anotherLabel 了解您的浮点问题。 mpmath可能就足够了。为此目的,bigfloat也有类似numpy的内容。

四处寻找你喜欢的东西。

答案 1 :(得分:1)

我没有很好的答案。一种技术是重新调整你的单位,比如设置c = 1,如果你处理大量的数据,那么你的计算然后在未缩放的系统中表达你的答案。如果你正在处理小单位,你必须做一些类似的事情。

我刚刚发现的另一个解决方案是mpmath模块,它声称能够进行高达1000单位精度的计算!他们的网站是http://mpmath.org,我希望这对你有用。

答案 2 :(得分:0)

一种可能性是将代码转换为使用精确算术,除了超越函数(在您的示例中为exp)之外的所有函数,例如使用https://docs.python.org/2/library/fractions.html。当然,需要转换超越函数的输入和输出。