Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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
Python 求幂期间溢出错误_Python_Math_Integer Overflow_Exponentiation - Fatal编程技术网

Python 求幂期间溢出错误

Python 求幂期间溢出错误,python,math,integer-overflow,exponentiation,Python,Math,Integer Overflow,Exponentiation,我很难计算这个。该代码适用于N=57之前(包括N=57)的所有值,但对于N大于或等于58的值,会抛出溢出错误(34,“结果太大”)。有办法解决这个问题吗?谢谢 import numpy as np import scipy.integrate import scipy.optimize import warnings warnings.filterwarnings('ignore') R = 6 N = 58 Nb = 4 S_norm = 0.3 Ao = 1/8.02e-5 y = (

我很难计算这个。该代码适用于N=57之前(包括N=57)的所有值,但对于N大于或等于58的值,会抛出溢出错误(34,“结果太大”)。有办法解决这个问题吗?谢谢

import numpy as np
import scipy.integrate
import scipy.optimize
import warnings
warnings.filterwarnings('ignore')

R = 6
N = 58
Nb = 4
S_norm = 0.3
Ao = 1/8.02e-5


y = (N-Nb/R)/Ao

def likelihood(psi):

    def func_likelihood(A):
        sum = 0
        for k in range(0, N+1):
            r = (np.math.factorial(N-k+Nb)/(np.math.factorial(k)*np.math.factorial(N-k))*(A*psi*(1+R))**k)
            sum = r+sum
        return sum* (np.exp(-0.5*(np.log(A/Ao)/S_norm)**2)*np.exp(-A*psi)/A)

    return (scipy.integrate.quad(func_likelihood, 0, np.inf, full_output=1,epsabs=1e-300, epsrel=1e-300))[0]

psi = y-y/10

MLE = scipy.optimize.fmin(lambda psi: -likelihood(psi), y, disp=0,full_output=1)[0][0]

normal_factor = 1/likelihood(MLE)

print(normal_factor* likelihood(psi))

您未能提供错误消息,但我打赌它是在从
for k
循环中的阶乘计算
r
时出现的

有几种方法可以解决这个问题。一种是切换操作顺序,这样可以消除常见因素,而不是从58开始!(超过默认的整数限制)。这涉及到更多的编码,或者可能调用一个组合的阶乘函数,比如will do C(n,k)——@LutzL提到了二项式函数。当然,你没有做一个很好的二项式,但是你可以使用它,然后根据需要调整
-k+Nb
因子的分子


另一种方法是切换到大整数(请参阅numpy和scipy的文档,以便解决所有包中的问题)。

您未能提供错误消息,但我打赌这是在从
for k
循环中的因数计算
r

有几种方法可以解决这个问题。一种是切换操作顺序,这样可以消除常见因素,而不是从58开始!(超过默认的整数限制)。这涉及到更多的编码,或者可能调用一个组合的阶乘函数,比如will do C(n,k)——@LutzL提到了二项式函数。当然,你没有做一个很好的二项式,但是你可以使用它,然后根据需要调整
-k+Nb
因子的分子


另一种方法是切换到大整数(请参阅numpy和scipy文档,以便在所有包中解决此问题)。

计算项的商并在每个步骤中使用该商更新项通常效率更高,溢出问题更少

压缩索引
k
的术语为

r[k] = ( (N-k+Nb)! )/( k!*(N-k)! ) * (A*psi*(1+R))**k
最后一项的商是

r[k+1] / r[k] = ( (N-k) )/( (N-k+Nb)*(k+1) ) * (A*psi*(1+R))

这样就可以将求和函数重新表示为

 def func_likelihood(A):
      sum = 0
      r = 1
      for k in range(Nb): r *= N+k+1
      sum = r
      for k in range(0, N+1):
          sum += r;
          r *= (A*psi*(1+R)) * (N-k)/((N-k+Nb)*(k+1))
      return sum * (np.exp(-0.5*(np.log(A/Ao)/S_norm)**2)*np.exp(-A*psi)/A)

计算项的商并在每个步骤中使用该商来更新项,通常效率更高,溢出问题更少

压缩索引
k
的术语为

r[k] = ( (N-k+Nb)! )/( k!*(N-k)! ) * (A*psi*(1+R))**k
最后一项的商是

r[k+1] / r[k] = ( (N-k) )/( (N-k+Nb)*(k+1) ) * (A*psi*(1+R))

这样就可以将求和函数重新表示为

 def func_likelihood(A):
      sum = 0
      r = 1
      for k in range(Nb): r *= N+k+1
      sum = r
      for k in range(0, N+1):
          sum += r;
          r *= (A*psi*(1+R)) * (N-k)/((N-k+Nb)*(k+1))
      return sum * (np.exp(-0.5*(np.log(A/Ao)/S_norm)**2)*np.exp(-A*psi)/A)

整数除法可能会有所帮助。例如,
(np.math.factorial(N-k+Nb)//(np.math.factorial(k)*np.math.factorial(N-k))
(np.math.factorial(N-k+Nb)//(np.math.factorial(k)//np.math.factorial(N-k))
。顺便说一句,您不应该使用
sum
作为变量名,因为这会影响内置的
sum
函数。在scipy或numpy中还应该有一个优化的二项式函数。@PM2Ring,整数除法不会给出正确的结果。谢谢您关于将“sum”用作变量的建议。哦,这是一次尝试你试过重新排列术语吗,例如
(factorial(N-k+Nb)//factorial(N-k))/factorial(k)
?另一个选择是在
范围(N-k+Nb,N-k,-1)
上循环执行大乘法,然后找到该结果的GCD并
factorial(k)
因此,在尝试浮点除法之前,您可以使用整数除法取消公因数。请注意,拼写
np.math.factorial
有点误导,因为它与NumPy无关:它只是常规的标准库
math.factorial
np.math就是math
->
True
)整数除法可能有帮助。例如,
(np.math.factorial(N-k+Nb)//(np.math.factorial(k)*np.math.factorial(N-k))
(np.math.factorial(N-k+Nb)//(np.math.factorial(k)//np.math.factorial(N-k))
。顺便说一句,您不应该使用
sum
作为变量名,因为这会影响内置的
sum
函数。在scipy或numpy中还应该有一个优化的二项式函数。@PM2Ring,整数除法不会给出正确的结果。谢谢您关于将“sum”用作变量的建议。哦,这是一次尝试你试过重新排列术语吗,例如
(factorial(N-k+Nb)//factorial(N-k))/factorial(k)
?另一个选择是在
范围(N-k+Nb,N-k,-1)
上循环执行大乘法,然后找到该结果的GCD并
factorial(k)
因此,在尝试浮点除法之前,您可以使用整数除法取消公因数。请注意,拼写
np.math.factorial
有点误导,因为它与NumPy无关:它只是常规的标准库
math.factorial
np.math就是math
->
True
np.math.factorial
已经使用了大整数,希望这些阶乘可以被安全地分割。但是我同意使用适当的
C(n,k)
更好。也许——但不处理58!是一个可疑的截止值。是的,但那是因为对大整数使用
/
会产生浮点结果。
np.math.factorial
已经使用大整数,希望可以安全地分割这些阶乘。但我同意使用适当的
C(n,k)
更好。也许——但不处理58!是一个可疑的截止值。是的,但那是因为对大整数使用
/
会产生浮点结果。