Python中绘制数值积分定义函数的contourf图失败,求解决方案
问题分析与修正方案
核心问题点
- 数组类型错误:原代码用
v=[0,0]*h创建的是一维列表结构,不是numpy二维数组,无法支持v[i,j]的二维索引赋值,这是导致绘图失败的直接原因。 - Lambda变量绑定陷阱:循环内定义的lambda函数会延迟捕获循环变量
i、j,最终所有积分计算都会使用循环结束时的i、j值,而非当前循环的对应值。 - 冗余操作:重复调用
np.meshgrid(x,y)属于无效操作,无需重复生成网格。
修正后的代码
import numpy as np from scipy import integrate import matplotlib.pyplot as plt x = np.arange(0, 5, 0.1) y = np.arange(0, 5, 0.1) h = len(y) # 初始化numpy二维零数组,用于存储积分结果 v = np.zeros((h, h)) X, Y = np.meshgrid(x, y) for i in range(h): for j in range(h): # 将x[i], y[j]作为默认参数传入lambda,避免延迟绑定问题 f = lambda o, x_val=x[i], y_val=y[j]: np.exp(o**6 * x_val * y_val) # 注意:当x_val和y_val较大时,指数项会溢出,这里可以考虑添加判断或调整范围 v[i, j], error = integrate.quad(f, 0, 2) fig, ax = plt.subplots(1, 1) m = ax.contourf(X, Y, v) ax.set_xlabel('x') ax.set_ylabel('y') cbar = fig.colorbar(m) plt.show()
额外说明
原代码中的积分函数np.exp(o**6*x[i]*y[j])在x、y接近5时,指数项会迅速变得极大,导致数值溢出(返回inf),如果需要正常绘图,建议缩小x、y的范围(比如调整到0-2),或者对积分函数做适当的数值处理。
内容的提问来源于stack exchange,提问作者Kristabella
相关产品推荐
相关产品推荐

