- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很需要计算this不可缺少的。几个月来,我一直在尝试这样做,使用 Python 中的 numpy 包,特别是 integrate.tplquad 函数。
from __future__ import division
from math import *
import numpy as np
import scipy.special as special
import scipy.integrate as integrate
a=1.e-19
b=1.e-09
zo=1.e7
H=1.e15
v=1.e18
def integrand(v,z,x,u):
value=x**(-0.5)*special.kv(5/3,u)*(a*v*z/x-1/2.)*exp(-b*sqrt(z*v/x))
return value
i=integrate.tplquad(lambda u,x,z: integrand(v,z,x,u),1.e7,1.e15,lambda z:0.,lambda z:np.inf, lambda x,z : x, lambda x,z : np.inf)
print i
在上面的代码中,我尝试了一个 v=10^18 的值,以便对指数的参数进行归一化,并且不会得到太小或太大的系数。
但是,无论我插入什么值的v,我总是得到
out: (0.0, 0.0)
我不知道如何超越这个问题。
我也试过将指数函数展开为幂级数,但我得到了相同的结果。
现在,我知道一个事实,即所有 v 的积分必须有一个有限的正值。事实上,如果我能计算任何 v 的积分,我会很高兴。
如果有人遇到过类似的问题,很高兴能分享他们的智慧。欢迎任何帮助。谢谢。
最佳答案
首先是可以精确求解 u 和 z 积分。结果是一个相当复杂的函数,涉及指数、 Gamma 函数和广义超几何级数。优点是它只针对一个变量,因此可以很容易地以图形方式对其进行检查。下面是一些曲线,对于不同的\nu 值:
下面是表达式:
集成这个函数很方便,因为这样做更快更准确。但是,这是第二点,由于 x ->\inf 的机器精度,这会遇到数值问题。这里有几个图表清楚地显示了问题:
当以任意工作精度绘图时,问题消失了:
因此,数值问题也必须通过在 Python 下使用任意精度库(如 mpmath
)和/或通过忽略/丢弃积分区间的上段来处理,即在这个例子,在 0 和 19/20 之间积分,而不是 0 和\inf。
下面是一个 Python 程序,它使用 mpmath
在 x=0 和 x=20 之间对上面的表达式(等效表达式)进行积分
#!/usr/bin/env python3
#encoding: utf
from mpmath import mp, mpf, sqrt, besselk, exp, quad, pi, hyper, gamma
maxprecision = 64 # significant digits
maxdegree = 3 # maximum degree of the quadrature rule
mp.dps = maxprecision
# z0 = mpf(1.e7)
# H = mpf(1.e15)
a = mpf(1.e-19)
b = mpf(1.e-9)
sqrt3 = sqrt(3.)
sqrt10 = sqrt(10.)
inf = mpf('inf')
epsilon=10.**-maxprecision
def integrand(z, x, u):
value = 1./sqrt(x) * besselk(5./3, u) * (a*z*nu/x - 1./2) * exp(-b * sqrt(z*nu/x))
return value
def integrand3(x):
value = 1. / (960. * b**4 * x**(19./6) * (nu / x)**(3./2)) * exp(-10000000. * sqrt10 * b * sqrt(nu/x)) * (-b**2 * x * (1000. * sqrt10 * b * (-10000. + exp(9999000. * sqrt10 * b * sqrt(nu/x))) * nu + (-1. + exp(9999000. * sqrt10 * b * sqrt(nu/x))) * x * sqrt(nu/x)) + 4. * a * (3000. * sqrt10 * b * (-10000. + exp(9999000. * sqrt10 * b * sqrt(nu/x))) * x * nu + 5000000000. * sqrt10 * b**3 * (-1000000000000. + exp(9999000. * sqrt10 * b * sqrt(nu/x))) * nu**2 + 3. * (-1. + exp(9999000. * sqrt10 * b * sqrt(nu/x))) * x**2 * sqrt(nu/x) + 15000000. * b**2 * (-100000000. + exp(9999000. * sqrt10 * b * sqrt(nu/x))) * x * nu * sqrt(nu/x))) * (-320. * sqrt3 * pi * x**(2./3) + 960. * 2.**(2./3) * gamma(2./3) * hyper([-1./3], [-2./3, 2./3], x**2 / 4.) + 27. * 2.**(1./3) * x**(10./3) * gamma(-2./3) * hyper([4./3], [7./3, 8./3], x**2 / 4.))
return value
for e in range(0, 19):
nu = mpf(10**e)
# I1 = quad(lambda x: quad(lambda u, z: integrand(z, x, u), [x, inf], [z0, H], method='tanh-sinh', maxdegree=maxdegree), [0., inf], method='tanh-sinh', maxdegree=maxdegree)
# print("ν = 10^%d: NI(x, u, z) = %f" % (e, I1))
I3 = quad(lambda x: integrand3(x), [0., 20.], method='tanh-sinh', maxdegree=maxdegree)
print("ν = 10^%d: NI(x) = %f" % (e, I3))
# print("ν = 10^%d: error = %.2f%% " % (e, (I3-I1)/(I1+epsilon)*100.))
结果是:
ν = 10^0: NI(x) = -12118569382494810.000000
ν = 10^1: NI(x) = -6061688705992958.000000
ν = 10^2: NI(x) = -2359248732202052.500000
ν = 10^3: NI(x) = -535994574128436.812500
ν = 10^4: NI(x) = -26417279314541.281250
ν = 10^5: NI(x) = 3636613281577.158203
ν = 10^6: NI(x) = 416805025513.477356
ν = 10^7: NI(x) = 41860949922.522430
ν = 10^8: NI(x) = 4285965504.873075
ν = 10^9: NI(x) = 477094892.498829
ν = 10^10: NI(x) = 65240304.226613
ν = 10^11: NI(x) = 9524738.222360
ν = 10^12: NI(x) = 680659.198974
ν = 10^13: NI(x) = 5287.165984
ν = 10^14: NI(x) = 0.224778
ν = 10^15: NI(x) = 0.000000
ν = 10^16: NI(x) = -0.000000
ν = 10^17: NI(x) = -0.000000
ν = 10^18: NI(x) = -0.000000
关于python - 使用Python进行三重积分的数值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40753390/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!