提问人:Sophie Er 提问时间:5/3/2023 更新时间:5/3/2023 访问量:67
将复杂函数与 scipy.integrate 集成
Integrate a complex function with scipy.integrate
问:
我想以数字方式对函数进行积分。在这个函数中,我有两种类型的球面坐标(r,th)和(rp,thp)。我想在 (rp,thp) 上积分,并尝试使用 if 循环为 (r,th) 提供值。
import numpy as np
from scipy.integrate import quad
wavelength = 1e-3 # m
R = 5 # m radius
aperture_diameter = 5e-1 # m
k = 2 * np.pi / wavelength # the wavenumber
# Define the number of points in the ring
num_points = 100
r_values = np.linspace(0, aperture_diameter / 2, num_points)
th_values = np.linspace(0, 2 * np.pi, num_points)
def f(rp, thp):
integrand = np.zeros_like(rp)
for i, rp_val in enumerate(rp):
for j, th_val in enumerate(thp):
integrand[i] = rp_val * np.exp(-1j * k / (2 * R) * (r_values[i]**2 + rp_val**2 - 2 * r_values[i]**2 * rp_val**2 * (np.cos(th_values[j]) * np.cos(th_val) + np.sin(th_values[j]) * np.sin(th_val))))
return integrand
# Define the integration limits
rp_limits = [0, int(aperture_diameter / 2)]
thp_limits = [0, int(2 * np.pi)]
# Perform numerical integration
result, _ = quad(lambda rp, thp: f(rp, thp), *rp_limits, *thp_limits)
print(result)
但是我得到了错误
TypeError: 'float' object is not iterable
请帮帮我,我很困惑。
答:
0赞
hpaulj
5/3/2023
#1
您是否真的阅读并尝试理解错误?或者只是跑到我们身边乞求帮助?
以下是完整的错误消息:
In [44]: result, _ = quad(lambda rp, thp: f(rp, thp), *rp_limits, *thp_limits)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[44], line 1
----> 1 result, _ = quad(lambda rp, thp: f(rp, thp), *rp_limits, *thp_limits)
File ~\miniconda3\lib\site-packages\scipy\integrate\_quadpack_py.py:411, in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
408 flip, a, b = b < a, min(a, b), max(a, b)
410 if weight is None:
--> 411 retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,
412 points)
413 else:
414 if points is not None:
File ~\miniconda3\lib\site-packages\scipy\integrate\_quadpack_py.py:523, in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
521 if points is None:
522 if infbounds == 0:
--> 523 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
524 else:
525 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)
Cell In[44], line 1, in <lambda>(rp, thp)
----> 1 result, _ = quad(lambda rp, thp: f(rp, thp), *rp_limits, *thp_limits)
Cell In[43], line 15, in f(rp, thp)
13 def f(rp, thp):
14 integrand = np.zeros_like(rp)
---> 15 for i, rp_val in enumerate(rp):
16 for j, th_val in enumerate(thp):
17 integrand[i] = rp_val * np.exp(-1j * k / (2 * R) * (r_values[i]**2 + rp_val**2 - 2 * r_values[i]**2 * rp_val**2 * (np.cos(th_values[j]) * np.cos(th_val) + np.sin(th_values[j]) * np.sin(th_val))))
TypeError: 'float' object is not iterable
所以这就是问题所在。 传递给 by 的是单个浮点数。你期待什么?enumerate(rp)
rp
f
quad
在回溯的前面
quad(func, a, b, args,...
你的也是如此(lambda 不会改变任何东西)。 并来自你的.接收为 (或者可能只是 )。func
f
a
b
*rp_limits
*thp_limits
args
thp_limits[0]
无论如何,您似乎都写好了限制,就好像您期望进行 2 个变量的积分一样。正如签名(及其其余文档)应该明确指出的那样,只集成了一个变量。f
quad
quad
使用或其他类似函数时,请确保您的输入与记录的规范相匹配。他们应该清楚地告诉你它对你的要求是什么 - 在参数和各种其他参数方面。 具有完全控制权;你必须遵守它的行为。quad
scipy
func
quad
评论
scipy.integrate.quad
用于单变量积分。对于二重积分,应使用 .您集成的 python 函数应接受单个输入点(和 for 或仅 for )并返回单个值。您尝试计算的数学函数是什么,它如何依赖于 、 、 和 ?scipy.integrate.dblquad
x
y
dblquad
x
quad
r
th
rp
thp