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

Python绘制Muller Brown双阱势能面仅显示单高斯问题排查

问题根因

你的代码无法显示双阱结构的核心问题是Python续行语法错误,和参数、绘图区间设置无关:
计算势能面Z时,第一行赋值语句结束后没有做续行标记,Python会默认该赋值语句已执行完成,后续三行以+开头的高斯项计算表达式虽然会被运算,但结果不会赋值给Z,直接被丢弃。最终Z仅存储了第一个高斯项的计算结果,自然只会呈现单峰形态。

修复方案

两种合法续行方式二选一即可:

  • 将Z的全部计算逻辑包裹在圆括号内,Python会自动识别括号内的换行属于同一段语句,写法简洁不易出错
  • 在每一行计算语句的末尾添加反斜杠\,手动标记续行

修复后的完整可运行代码如下,额外添加了轮廓层级设置优化显示效果,避免正势能项压缩势阱区域的显示对比度:

import numpy as np
import matplotlib.pyplot as plt

# Muller Brown势标准参数
A = np.array([-200, -100, -170, 15])
a = np.array([-1, -1, -6.5, 0.7])
b = np.array([0, 0, 11, 0.6])
c = np.array([-10, -10, -6.5, 0.7])
x_m = np.array([1, 0, -0.5, -1])
y_m = np.array([0, 0.5, 1.5, 1])

# 标准绘图区间
x = np.linspace(-2.0, 1.2, 1000)
y = np.linspace(-0.2, 2.0, 1000)
XX, YY = np.meshgrid(x, y)

# 括号包裹实现自动续行,四个高斯项全部计入计算
Z = (
    A[0]*np.exp( a[0]*(XX-x_m[0])**2 + b[0]*(XX-x_m[0])*(YY-y_m[0]) + c[0]*(YY-y_m[0])**2 )
    + A[1]*np.exp( a[1]*(XX-x_m[1])**2 + b[1]*(XX-x_m[1])*(YY-y_m[1]) + c[1]*(YY-y_m[1])**2 )
    + A[2]*np.exp( a[2]*(XX-x_m[2])**2 + b[2]*(XX-x_m[2])*(YY-y_m[2]) + c[2]*(YY-y_m[2])**2 )
    + A[3]*np.exp( a[3]*(XX-x_m[3])**2 + b[3]*(XX-x_m[3])*(YY-y_m[3]) + c[3]*(YY-y_m[3])**2 )
)

fig, ax = plt.subplots(figsize=(8,6))
# 手动指定轮廓层级,截断高值正势能区域,清晰显示双阱与鞍点结构
levels = np.linspace(Z.min(), 50, 30)
contour_plot = ax.contourf(XX, YY, Z, levels=levels, cmap='viridis')
plt.colorbar(contour_plot, label='势能值')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Muller-Brown势能面')
plt.show()
显示优化说明

Muller-Brown势的第四项是正值的排斥势能,数值远高于两个势阱的负值区域,如果使用contourf默认的轮廓层级,颜色映射范围会被高值区域拉宽,导致两个势阱区域颜色差异极小,看起来仍然像单峰。手动设置levels参数将显示上限截断到50左右,就能清晰观测到两个势阱、中间过渡鞍点的经典双阱结构。

内容的提问来源于stack exchange,提问作者reloh100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:31:13