我在解决此python积分时遇到问题。集成的功能未在集成的边界上定义。
我发现了一些与此类似的问题,但是所有这些问题都是针对该问题的非常具体的答复。
我不想过多地积分,如果可能的话也不要,因为我首先要进行积分的原因是避免近似。
有什么办法解决这个积分?

import numpy as np
from pylab import *
import scipy
from math import *
from scipy import integrate

m_Earth_air = (28.0134*0.78084)+(31.9988*0.209476)+(39.948*0.00934)+(44.00995*0.000314)+(20.183*0.00001818)+(4.0026*0.00000524)+(83.80*0.00000114)+(131.30*0.000000087)+(16.04303*0.000002)+(2.01594*0.0000005)
Tb0 = 288.15
Lb0 = -6.5
Hb0 = 0.0
def Tm_0(z):
    return Tb0+Lb0*(z-Hb0)
k = 1.38*10**-19 #cm^2.kg/s^2.K   #Boltzmann cst
mp = 1.67262177*10**-27 #kg
Rad= 637100000.0 #radius planet #cm
g0 = 980.665 #cm/s^2
def g(z):
    return (g0*((Rad/(Rad+z))**2.0))
def scale_height0(z):
    return k*Tm_0(z*10**-5)/(m_Earth_air*mp*g(z))



def functionz(z,zvar):
    return np.exp(-zvar/scale_height0(z))*((Rad+zvar)/(Rad+z))/((np.sqrt(((Rad+zvar)/(Rad+z))**2.0-1.0)))

def chapman0(z):
    return (1.0/(scale_height0(z)))*((integrate.quad(lambda zvar: functionz(z,zvar), z, np.inf))[0])

print chapman0(1000000)
print chapman0(5000000)


第一个变量和定义块很好。问题出在“ functionz(z,zvar)”及其集成中。
任何帮助非常感谢!

最佳答案

它通常通过重新缩放变量来帮助消除可能的数值不稳定性。在您的情况下,zvar1e6开始,这可能是由于quad()中的某些实现细节而引起的问题。如果将其缩放为y = zvar / z,以便集成从1开始,那么z = 1e6似乎可以很好地收敛:

def functiony(z, y):
    return np.exp(-y*z/scale_height0(z))*(Rad+y*z)/(Rad+z) / np.sqrt(((Rad+y*z)/(Rad+z))**2.0-1.0)

def chapman0y(z):
    return (1.0/(scale_height0(z)))*((integrate.quad(lambda y: functiony(z,y), 1, np.inf))[0])

>>> print(chapman0y(1000000))

1.6217257661844094e-06


(我设置了m_Earth_air = 28.8e-3-您的代码中缺少此常数,我假设它是空气的摩尔质量,以(编辑)kg / mol为单位)。

对于z = 5e6scale_height0(z)为负,这在指数下给出了很大的正值,从而使积分在无穷大处发散。

关于python - 解决不正确的积分而不近似,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30769913/

10-16 03:07