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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:34