我想对一个函数求数值积分。在这个函数中,我有两种类型的球坐标(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
请帮帮我,我很困惑。
1条答案
按热度按时间jyztefdp1#
你真的读过,并试图理解错误吗?还是跑来求我们帮忙
以下是完整的错误消息:
所以是
enumerate(rp)
出了问题。quad
传递给f
的rp
是一个浮点数。你在期待什么?在之前的追踪中
所以
func
就是你的f
(lambda不会改变任何东西)。a
和b
来自*rp_limits
。*thp_limits
被接收为args
(或者可能只是thp_limits[0]
)。在任何情况下,你似乎写
f
和限制,好像你希望做一个2变量的积分。正如quad
签名(以及其文档的其余部分)应该清楚说明的那样,quad
只集成了一个变量。使用
quad
或其他类似的scipy
函数时,请确保输入符合文档中的规格。它们应该清楚地告诉您func
需要什么参数和其他各种参数。quad
具有完全控制权;你就得顺应它的行为。