在 python 中使用 Cubature
Using Cubature in python
我正在尝试计算一个看似简单的积分。这是 MMA 代码:
In[1]:= rect[x_] = If[x <= 0.5, 1, 0];
In[2]:= N[Integrate[Integrate[rect[(x^2 + y^2)^.5], {x, 0, 100.}], {y, 0., 100.}]]
Out[3]= 0.19635
但是,当我使用 Python 中的 cubature 包执行此操作时,对于超过 13 的积分限制,甚至 (-13,13),我都无法得到任何合理的信息。它确实必须是 +/- 10 之类的东西。
这里是 python 代码:
import time
import numpy as np
from cubature import cubature
start = time.time()
def rect(r):
return np.where(abs(r) <= 0.5, 1, 0)
def Wp(r1, r2):
return rect((r1 ** 2 + r2 ** 2) ** 0.5)
def integrand_rectangle(x_array):
return Wp(x_array[:, 0], x_array[:, 1])
# boundaries
a = 0.0
b_x = 100.0
xmin_t = [a, a]
xmax_t = [b_x, b_x]
val_t, err_t = cubature(integrand_rectangle, 2, 1, xmin_t, xmax_t, vectorized=True)
print(val_t)
end = time.time()
print(f"Runtime of the program is {end - start}")
我尝试过交互次数、相对和绝对误差容限,似乎没有什么可以解决这个问题。有解决办法吗?为什么这个经过良好测试的包不能执行如此简单的集成?我做错了吗?
我已经尝试过原始的 C-cubature,它完美且快速! python——C接口的问题!这是一个错误!
我正在尝试计算一个看似简单的积分。这是 MMA 代码:
In[1]:= rect[x_] = If[x <= 0.5, 1, 0];
In[2]:= N[Integrate[Integrate[rect[(x^2 + y^2)^.5], {x, 0, 100.}], {y, 0., 100.}]]
Out[3]= 0.19635
但是,当我使用 Python 中的 cubature 包执行此操作时,对于超过 13 的积分限制,甚至 (-13,13),我都无法得到任何合理的信息。它确实必须是 +/- 10 之类的东西。
这里是 python 代码:
import time
import numpy as np
from cubature import cubature
start = time.time()
def rect(r):
return np.where(abs(r) <= 0.5, 1, 0)
def Wp(r1, r2):
return rect((r1 ** 2 + r2 ** 2) ** 0.5)
def integrand_rectangle(x_array):
return Wp(x_array[:, 0], x_array[:, 1])
# boundaries
a = 0.0
b_x = 100.0
xmin_t = [a, a]
xmax_t = [b_x, b_x]
val_t, err_t = cubature(integrand_rectangle, 2, 1, xmin_t, xmax_t, vectorized=True)
print(val_t)
end = time.time()
print(f"Runtime of the program is {end - start}")
我尝试过交互次数、相对和绝对误差容限,似乎没有什么可以解决这个问题。有解决办法吗?为什么这个经过良好测试的包不能执行如此简单的集成?我做错了吗?
我已经尝试过原始的 C-cubature,它完美且快速! python——C接口的问题!这是一个错误!