洛伦兹方程相平面分析绘图求助:代码报错无法生成鞍点、螺旋图
洛伦兹方程相平面分析图绘制问题解决
问题描述
尝试绘制洛伦兹方程的相平面分析图(包含鞍点、螺旋、节点),但运行代码持续报错,调整绘图函数和变量顺序后仍无法得到预期图形。原代码如下:
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()
错误分析
- 变量覆盖导致维度不匹配:原代码重复对
yy赋值(先作为x-y网格的y分量,后又作为y-z网格的y分量),导致后续计算uu, vv, ww时变量维度混乱,触发streamplot的维度不匹配报错。 - 相平面变量对应错误:每个相平面需要匹配正确的变量网格与导数向量,比如x-z平面应使用x和z的网格,计算
dx/dt和dz/dt,原代码错误用y-z网格搭配x和z的导数,导致图形逻辑错误。 - 轴标签与实际变量不符:部分子图标签标注错误,比如第三个子图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
相关产品推荐
相关产品推荐

