如何将Mathematica参数绘图代码转换为Python matplotlib实现
Mathematica ListPlot迁移Python解决方案
核心不一致原因
你当前代码的最关键错误是欧拉更新逻辑和Mathematica不匹配:Mathematica中先更新x值,再用更新后的新x计算y的新值;但你的Python代码中计算y时用的还是更新前的旧x,导致轨迹完全偏离。
其他需要修改的细节
- Mathematica中单位圆是虚线,你的Python代码把轨迹设为了虚线、单位圆设为实线,样式搞反
- 你手动设置了xlim/ylim为(-1.5,1.5),而显式欧拉法的解会随迭代发散,超出这个范围的部分被截断,和Mathematica的
PlotRange -> All自动适配范围的逻辑不符 - 多余的
odeint相关代码没有用到,可以删除 - 标签里的参数标注错误,和你实际设置的r=2.1、dt=0.5不匹配
完整可运行代码
import numpy as np import matplotlib.pyplot as plt # 参数设置和Mathematica完全一致 r = 2.1 tfinal = 7.0 dt = 0.5 n = int(tfinal / dt) # 初始化轨迹数组 xtraj = np.zeros(n + 1) ytraj = np.zeros(n + 1) xtraj[0] = 1 ytraj[0] = 0 # 欧拉迭代,和Mathematica逻辑完全对齐:先用旧值算新x,再用新x算新y for i in range(n): xtraj[i+1] = xtraj[i] - r * ytraj[i] * dt # 注意这里用的是刚算出来的xtraj[i+1],不是旧的xtraj[i] ytraj[i+1] = ytraj[i] + r * xtraj[i+1] * dt fig, ax = plt.subplots(figsize=(7,7)) # 画单位圆,虚线,和Mathematica一致 theta = np.linspace(0, 2 * np.pi, 150) ax.plot(np.cos(theta), np.sin(theta), c='k', linestyle='dashed', label='单位圆') # 画轨迹,实线连点,和Mathematica ListPlot Joined=True一致 ax.plot(xtraj, ytraj, marker='o', linestyle='-', c='#1f77b4', label='迭代轨迹') # 等比例坐标轴 ax.set_aspect(1) # 自动适配范围,对应Mathematica PlotRange->All ax.autoscale() ax.legend() plt.show()
运行上述代码即可复现你提供的Mathematica运行效果。
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

