如何用Python模拟动力系统的稳定与不稳定流形?代码问题求助
代码核心错误分析
- 精确等于原点的判断完全不现实:数值迭代中,状态几乎不可能精确等于
(0,0),必须使用阈值判断(如abs(x_run) < 1e-6且abs(y_run) < 1e-6)来认定状态足够接近原点。 - 迭代次数设置错误:
np.linspace(0,5000)默认仅生成50个元素,意味着每个初始点仅迭代50次,次数太少不足以让稳定流形上的点收敛到原点。应使用range(5000)实现指定次数的迭代。 - 数据存储效率极低:你将所有迭代步骤的状态都存入列表,会生成数千万个数据点,既占用内存又导致绘图卡顿。只需记录符合条件的初始点即可。
- 迭代逻辑可优化:虽然数学表达式正确,但用临时变量直接计算新状态并整体替换,会更清晰且避免潜在错误。
修正后的代码示例
import numpy as np import matplotlib.pyplot as plt import math # 存储稳定流形的初始点 stable_x = [] stable_y = [] # 初始条件网格 x_range = np.linspace(-0.5, 0.5, 100) y_range = np.linspace(-0.5, 0.5, 100) epsilon = -0.5 iterations = 5000 # 迭代次数 tol = 1e-6 # 收敛阈值 for x0 in x_range: for y0 in y_range: x, y = x0, y0 for _ in range(iterations): # 计算下一时刻状态 sin_term = math.sin(2 * math.pi * x) new_y = y + epsilon * sin_term new_x = x + y + epsilon * sin_term x, y = new_x, new_y # 提前终止:已足够接近原点则停止迭代 if abs(x) < tol and abs(y) < tol: break # 判断最终状态是否接近原点,是则记录初始点 if abs(x) < tol and abs(y) < tol: stable_x.append(x0) stable_y.append(y0) # 绘制稳定流形 plt.figure(figsize=(8,6)) plt.scatter(stable_x, stable_y, s=5, c='blue', label='稳定流形') plt.xlabel('x₀') plt.ylabel('y₀') plt.title(f'原点附近的稳定流形 (ε={epsilon})') plt.legend() plt.grid(True) # 可选:绘制部分初始点的迭代轨迹 plt.figure(figsize=(8,6)) test_points = [(-0.2, 0.1), (0.1, -0.1), (-0.3, -0.2)] colors = ['red', 'green', 'orange'] for (x0, y0), color in zip(test_points, colors): x_traj, y_traj = [], [] x, y = x0, y0 for _ in range(1000): x_traj.append(x) y_traj.append(y) sin_term = math.sin(2 * math.pi * x) new_y = y + epsilon * sin_term new_x = x + y + epsilon * sin_term x, y = new_x, new_y plt.plot(x_traj, y_traj, color=color, label=f'初始点({x0},{y0})') plt.xlabel('x') plt.ylabel('y') plt.title('部分初始点的迭代轨迹') plt.legend() plt.grid(True) plt.show()
额外说明
如果要计算不稳定流形,通常需要从原点附近的点反向迭代(求解逆映射:给定x_{n+1}, y_{n+1}推导x_n, y_n),因为正向迭代时不稳定流形上的点会快速远离原点,难以直接追踪。
内容的提问来源于stack exchange,提问作者chrispeng
相关产品推荐
相关产品推荐

