基于Scipy的数组乘积二重数值积分实现问题求助
解决返回数组的函数的二重数值积分问题
错误原因
你写的f1 = lambda y: quad_vec(func,0,1, args = (y,))中,quad_vec返回的是**(积分结果数组, 误差估计数组)**的元组,外层quad_vec处理这个元组时,会尝试将其作为数值参与运算,触发了序列与浮点数相乘的类型错误。
解决方案1:修正分步积分逻辑
只需要让内层积分返回纯结果数组(舍弃误差项),代码如下:
import numpy as np from scipy.integrate import quad_vec def func(x,y): a = np.array([[x**2+2*y, y-2],[2*x+2*y, y**2-3*x]]) return a.dot(a) # 内层积分仅返回结果数组(取quad_vec返回值的第一个元素) f1 = lambda y: quad_vec(func, 0, 1, args=(y,))[0] # 外层积分对结果数组逐元素积分 result, error = quad_vec(f1, 0, 1) print("积分结果数组:") print(result) print("\n误差估计数组:") print(error)
运行这段代码就能得到正确的2x2积分结果数组,每个元素对应原函数对应位置元素的二重积分值。
解决方案2:使用scipy.integrate.nquad
nquad支持多变量积分,且能兼容返回数组的被积函数,写法更简洁:
import numpy as np from scipy.integrate import nquad def func(x,y): a = np.array([[x**2+2*y, y-2],[2*x+2*y, y**2-3*x]]) return a.dot(a) # 定义积分限:x从0到1,y从0到1 limits = [[0, 1], [0, 1]] result, error = nquad(func, limits) print("积分结果数组:") print(result) print("\n误差估计数组:") print(error)
nquad会自动处理多变量积分,并且直接返回数组形式的结果,无需手动嵌套积分。
补充说明
两种方法本质都是对数组的每个元素分别做二重积分,因为数值积分是逐元素进行的。如果你的被积函数是更复杂的高维数组,这两种方法同样适用。
内容的提问来源于stack exchange,提问作者Sadjad Abedi
相关产品推荐
相关产品推荐

