python - Quadpy中具有非常数限制的双积分?
问题描述
我需要集成一个在 2Dims (z
和 radius r
)中定义的函数,对此我没有表达式。
我可以在任何位置查询函数(z,r)
并获取返回值。
我有跨 z: 的积分范围[-z_range, z_range]
,我将其分为以下N_z
几点:
z_is = -z_range + (np.arange(N_z) + 0.5) * (2.*z_range/N_z)
对于 中的每个值z_is
,要整合的范围r
是:[0, r_thresh_at_this_z]
。
r_thresh_at_this_z
是从被z
调用的值中获得的z_i
:
def get_r_thresh(z_i):
return expression_of_z_i # returns a positive float.
所以径向积分的范围取决于 上的值z
。
我的函数 f 为:
def f(r,z):
return interpolator_for_f(r,z)
我想以quadpy
最有效的方式使用这个包,因为它被创建为能够以这种方式使用。
我正在考虑使用 for 循环遍历,并对 中的每个值z_is
执行高斯正交。[0, r_thres_for_that_z]
z_is
我可以使用:
results = np.zeros((N_z))
errs = np.zeros((N_z))
for i in range(N_z):
def f(r):
return interpolator_for_f(r,z_is[i])
results[i], errs[i] = quadpy.quad(f, [0, r_thresh_at_this_z])
但我觉得 for 循环并不是使用 quadpy 的最有效方式。
你能告诉我我在只用快速的 numpy 数组做这个积分时缺少什么,所以没有 for 循环?
[我已经阅读x
了函数输入的形状f
。在我的情况下d = 1
,因为它是跨 r 的线积分。
n = N_z
因为我想执行N_z
这样的线积分,然后我将它们相加以获得 1 个单标量,即(整个)双积分的结果。
p = 1000
因为假设我想要 1000 个积分点r
,对于z
.
所以我需要在N_z * 1000
点处对函数进行采样。
函数f
应返回一个数组形状(N_z, 1000)
这些参数的识别是否有任何帮助?]
谢谢!
解决方案
Quadpy 作者在这里。
我想以最有效的方式使用 quadpy 包,因为它被创建为能够以这种方式使用。
事实并非如此。Quadpy 有助于在各种规范域中集成功能,但在任意二维域上集成的功能尚不存在。doublequad/nquad 应该在 quadpy 中,但还没有。
推荐阅读
- assembly - ARM中的CMP和TST指令有什么区别?
- c# - CsvHelper:ExpandoObject 中已存在具有相同键 '' 的元素
- laravel-5 - 犹豫要不要在我的 laravel 5.5 项目中删除实用程序
- angularjs - ng-change 不适用于已更改的项目
- jenkins - 我们什么时候需要为 Jenkins 提供奴隶,什么时候不需要?
- perl - 禁用整个文件的评论家 - Parse::RecDescent 预编译解析器和 PerlCritic/Tidyall
- amazon-web-services - AWS ECS:监控服务更新的状态
- elixir - 有没有办法在控制器内获取存在列表?
- c++ - 从参数包中提取成员类型
- javascript - 创建倒数到 0 的十进制值数组