将复杂函数与 scipy.integrate 集成

Integrate a complex function with scipy.integrate

提问人:Sophie Er 提问时间:5/3/2023 更新时间:5/3/2023 访问量:67

问:

我想以数字方式对函数进行积分。在这个函数中,我有两种类型的球面坐标(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

请帮帮我,我很困惑。

python numpy scipy 浮点 复数

评论

0赞 Michael Ruth 5/3/2023
请提供完整的回溯
0赞 yut23 5/3/2023
scipy.integrate.quad用于单变量积分。对于二重积分,应使用 .您集成的 python 函数应接受单个输入点(和 for 或仅 for )并返回单个值。您尝试计算的数学函数是什么,它如何依赖于 、 、 和 ?scipy.integrate.dblquadxydblquadxquadrthrpthp
0赞 Lutz Lehmann 5/3/2023
没有“if 循环”这样的东西。

答:

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)rpfquad

在回溯的前面

quad(func, a, b, args,...

你的也是如此(lambda 不会改变任何东西)。 并来自你的.接收为 (或者可能只是 )。funcfab*rp_limits*thp_limitsargsthp_limits[0]

无论如何,您似乎都写好了限制,就好像您期望进行 2 个变量的积分一样。正如签名(及其其余文档)应该明确指出的那样,只集成了一个变量。fquadquad

使用或其他类似函数时,请确保您的输入与记录的规范相匹配。他们应该清楚地告诉你它对你的要求是什么 - 在参数和各种其他参数方面。 具有完全控制权;你必须遵守它的行为。quadscipyfuncquad