python中无限极限的集成

python中无限极限的集成,python,numpy,scipy,integration,infinity,Python,Numpy,Scipy,Integration,Infinity,我在(0,无限)极限内积分时面临困难。我正在尝试做这个Jupyter笔记本(不知道这是否是一个相关的信息)。代码如下: import numpy as np import matplotlib.pyplot as plt import scipy as sc import math from scipy.integrate import quad def integrand3(x,z,m,n): return ((np.cosh(x))**m)*((np.sinh(x))**n)*(n

我在(0,无限)极限内积分时面临困难。我正在尝试做这个Jupyter笔记本(不知道这是否是一个相关的信息)。代码如下:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sc
import math
from scipy.integrate import quad

def integrand3(x,z,m,n):
    return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))

def IgK0(z,m,n):
    IntK1 = quad(integrand3, 0, 1, args=(z,m,n))
    return IntK1

IgK0(1,1,1)
IgKI(1,0,1)

<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: overflow encountered in cosh
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: overflow encountered in sinh
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: invalid value encountered in double_scalars
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-76-9bee7a5d6456>:2: IntegrationWarning: The occurrence of roundoff error is detected, which prevents 
  the requested tolerance from being achieved.  The error may be 
  underestimated.
  IntKI = quad(integrand3, 0, np.inf, args=(z,m,n))

(nan, nan)
结果如下:

(0.19224739693489237, 2.1343748650136926e-15)
这没关系。但当我用无穷大替换上限时,我得到的输出是'nan'。请参阅以下代码:

def IgKI(z,m,n):
    IntKI = quad(integrand3, 0, np.inf, args=(z,m,n))
    return IntKI
当我对(m,n)使用(0,0)值时,虽然有一些错误我不理解,但至少我得到了一些答案

IgKI(1,0,0)

<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: overflow encountered in cosh
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: overflow encountered in sinh
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
(0.42102443824067737, 1.3628527263018718e-08)
IgKI(1,0,0)
:2:运行时警告:cosh中遇到溢出
返回((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
:2:运行时警告:sinh中遇到溢出
返回((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
(0.42102443824067737、1.3628527263018718e-08)
但当我对(m,n)使用任何其他值时,我得到以下结果:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sc
import math
from scipy.integrate import quad

def integrand3(x,z,m,n):
    return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))

def IgK0(z,m,n):
    IntK1 = quad(integrand3, 0, 1, args=(z,m,n))
    return IntK1

IgK0(1,1,1)
IgKI(1,0,1)

<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: overflow encountered in cosh
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: overflow encountered in sinh
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-53-9b9d0956fa85>:2: RuntimeWarning: invalid value encountered in double_scalars
  return ((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
<ipython-input-76-9bee7a5d6456>:2: IntegrationWarning: The occurrence of roundoff error is detected, which prevents 
  the requested tolerance from being achieved.  The error may be 
  underestimated.
  IntKI = quad(integrand3, 0, np.inf, args=(z,m,n))

(nan, nan)
IgKI(1,0,1)
:2:运行时警告:cosh中遇到溢出
返回((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
:2:运行时警告:sinh中遇到溢出
返回((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
:2:运行时警告:在双_标量中遇到无效值
返回((np.cosh(x))**m)*((np.sinh(x))**n)*(np.exp(-z*np.cosh(x)))
:2:IntegrationWarning:检测到舍入错误的发生,这会阻止
无法达到要求的公差。错误可能是
被低估了。
IntKI=quad(integrand3,0,np.inf,args=(z,m,n))
(楠,楠)

那么,我做错了什么呢?

错误很明显-您遇到了溢出,而一切都中断了。这是由于您的功能很快就会出现分歧:

>>> [np.cosh(10**x) for x in range(5)]
__main__:1: RuntimeWarning: overflow encountered in cosh
[1.5430806348152437, 11013.232920103324, 1.3440585709080678e+43, inf, inf]
在1000时,Python已经无法计算
cosh
(例如)。实际上,将
(1,1,1)
积分到100就可以了。由于这是数值积分,因此需要计算边界处的值(无穷大也将转换为边界,但您可以使用1000进行测试)。正如您从警告中所看到的,这意味着函数的每个部分都是单独计算的,更不用说将其提升为幂,并将其指数化


此库无法满足您的需要。您可以尝试使用Symphy或Mathematica等更专用的工具进行符号积分。

错误很明显-您遇到溢出,一切都会中断。这是由于您的功能很快就会出现分歧:

>>> [np.cosh(10**x) for x in range(5)]
__main__:1: RuntimeWarning: overflow encountered in cosh
[1.5430806348152437, 11013.232920103324, 1.3440585709080678e+43, inf, inf]
在1000时,Python已经无法计算
cosh
(例如)。实际上,将
(1,1,1)
积分到100就可以了。由于这是数值积分,因此需要计算边界处的值(无穷大也将转换为边界,但您可以使用1000进行测试)。正如您从警告中所看到的,这意味着函数的每个部分都是单独计算的,更不用说将其提升为幂,并将其指数化


此库无法满足您的需要。您可以尝试使用符号积分,例如使用Symphy或Mathematica等更专用的工具。

为什么您希望数值积分方法能够在无限极限下工作?这对我来说毫无意义。即使解析解存在,在数值上你能做的最好的事情就是尝试几个大的数字,然后投射一个收敛点。为什么你期望数值积分方法在无限极限下工作?这对我来说毫无意义。即使解析解存在,在数值上你能做的最好的事情就是尝试几个大的数字,然后投射一个收敛点。谢谢你花时间回答。我以前在mathematica学过。它在那里工作。谢谢你推荐sympy。我明白你的意思。那我就试试别的。谢谢你花时间回答。我以前在mathematica学过。它在那里工作。谢谢你推荐sympy。我明白你的意思。那我就试试别的。