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

洛伦兹方程相平面分析绘图求助:代码报错无法生成鞍点、螺旋图

洛伦兹方程相平面分析图绘制问题解决

问题描述

尝试绘制洛伦兹方程的相平面分析图(包含鞍点、螺旋、节点),但运行代码持续报错,调整绘图函数和变量顺序后仍无法得到预期图形。原代码如下:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-40,40,100)
y = np.linspace(-60,50,100)
z = np.linspace(-100,100,100)
 
rho=28
beta=8/3
sigma=10

xx,yy = np.meshgrid(x,y)
yy,zz = np.meshgrid(y,z)
yy,zz = np.meshgrid(y,z)

uu = sigma*(yy - xx)
vv= rho*xx - yy - xx*zz
ww= xx*yy - beta*zz

fig = plt.figure(figsize=(15,5))

ax1 = fig.add_subplot(131)
ax1.streamplot(xx,yy,uu,vv)
ax1.set_xlabel('$x$')
ax1.set_ylabel('$y$')
ax1.set_title('phaseportrait using streamplot')
plt.show()

fig = plt.figure(figsize=(15,5))
ax3 = fig.add_subplot(133)
ax3.streamplot(yy,zz,uu,ww)
ax3.set_xlabel('$x$')
ax3.set_ylabel('$z$')
ax3.set_title('phaseportrait using streamplot')
plt.show()

fig = plt.figure(figsize=(15,5))
ax2 = fig.add_subplot(132)
ax2.streamplot(yy,zz,vv,ww)
ax2.set_xlabel('$z$')
ax2.set_ylabel('$y$')
ax2.set_title('phaseportrait using streamplot')
plt.show()

错误分析

  1. 变量覆盖导致维度不匹配:原代码重复对yy赋值(先作为x-y网格的y分量,后又作为y-z网格的y分量),导致后续计算uu, vv, ww时变量维度混乱,触发streamplot的维度不匹配报错。
  2. 相平面变量对应错误:每个相平面需要匹配正确的变量网格与导数向量,比如x-z平面应使用x和z的网格,计算dx/dt和dz/dt,原代码错误用y-z网格搭配x和z的导数,导致图形逻辑错误。
  3. 轴标签与实际变量不符:部分子图标签标注错误,比如第三个子图x轴标注为$x$,但实际使用的是y变量网格,造成图形解读混乱。

修正后的代码

import numpy as np
import matplotlib.pyplot as plt

# 洛伦兹方程参数
rho = 28
beta = 8/3
sigma = 10

# 定义平衡点:鞍点(0,0,0),螺旋点(±√(beta(rho-1)), ±√(beta(rho-1)), rho-1)
eq1 = (0, 0, 0)
eq2 = (np.sqrt(beta*(rho-1)), np.sqrt(beta*(rho-1)), rho-1)
eq3 = (-np.sqrt(beta*(rho-1)), -np.sqrt(beta*(rho-1)), rho-1)

# 创建统一布局的子图
fig, axes = plt.subplots(1, 3, figsize=(18, 6))

# 1. x-y相平面
x = np.linspace(-40, 40, 100)
y = np.linspace(-60, 50, 100)
xx, yy = np.meshgrid(x, y)
# 固定z为鞍点的z值,计算dx/dt和dy/dt
z_fixed = 0
uu = sigma * (yy - xx)
vv = rho * xx - yy - xx * z_fixed

ax1 = axes[0]
ax1.streamplot(xx, yy, uu, vv, density=1.2, color='darkblue')
# 标注平衡点
ax1.scatter(eq1[0], eq1[1], color='red', marker='o', label='鞍点')
ax1.scatter(eq2[0], eq2[1], color='green', marker='^', label='螺旋点')
ax1.scatter(eq3[0], eq3[1], color='green', marker='^')
ax1.set_xlabel('$x$')
ax1.set_ylabel('$y$')
ax1.set_title('x-y 相平面')
ax1.legend()
ax1.grid(alpha=0.3)

# 2. y-z相平面
y = np.linspace(-60, 50, 100)
z = np.linspace(0, 50, 100)
yy, zz = np.meshgrid(y, z)
# 固定x为鞍点的x值,计算dy/dt和dz/dt
x_fixed = 0
vv = rho * x_fixed - yy - x_fixed * zz
ww = x_fixed * yy - beta * zz

ax2 = axes[1]
ax2.streamplot(yy, zz, vv, ww, density=1.2, color='darkred')
ax2.scatter(eq1[1], eq1[2], color='red', marker='o')
ax2.scatter(eq2[1], eq2[2], color='green', marker='^')
ax2.scatter(eq3[1], eq3[2], color='green', marker='^')
ax2.set_xlabel('$y$')
ax2.set_ylabel('$z$')
ax2.set_title('y-z 相平面')
ax2.grid(alpha=0.3)

# 3. x-z相平面
x = np.linspace(-40, 40, 100)
z = np.linspace(0, 50, 100)
xx, zz = np.meshgrid(x, z)
# 固定y为鞍点的y值,计算dx/dt和dz/dt
y_fixed = 0
uu = sigma * (y_fixed - xx)
ww = xx * y_fixed - beta * zz

ax3 = axes[2]
ax3.streamplot(xx, zz, uu, ww, density=1.2, color='darkgreen')
ax3.scatter(eq1[0], eq1[2], color='red', marker='o')
ax3.scatter(eq2[0], eq2[2], color='green', marker='^')
ax3.scatter(eq3[0], eq3[2], color='green', marker='^')
ax3.set_xlabel('$x$')
ax3.set_ylabel('$z$')
ax3.set_title('x-z 相平面')
ax3.grid(alpha=0.3)

plt.tight_layout()
plt.show()

关键调整说明

  • 为每个相平面单独创建对应网格,避免变量覆盖,确保维度匹配。
  • 绘制相平面时固定第三个变量为平衡点取值,清晰展示鞍点与螺旋点的特征。
  • 添加平衡点标注,用不同颜色和标记区分鞍点(红色圆点)与螺旋点(绿色三角)。
  • 统一布局为一行三子图,优化可视化效果,添加网格提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:30:54