You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:40:35