Python绘制蝴蝶效应曲线

本文介绍了蝴蝶曲线(洛伦兹吸引子),一种与混沌理论紧密相关的概念,通过Python代码展示了如何使用洛伦兹方程模拟并可视化这种系统的长期行为,强调了初始条件微小变化可能导致结果的巨大差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蝴蝶曲线(也称为蝴蝶效应曲线或洛伦兹吸引子)通常与混沌理论相关,特别是爱德华·洛伦兹的工作。洛伦兹吸引子是一个三维结构,它描述了某些动态系统的长期行为,即使这些系统的初始条件只有微小的变化也会导致截然不同的结果。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 洛伦兹吸引子的参数
sigma = 10.0
beta = 8.0 / 3.0
rho = 28.0

# 时间步长
dt = 0.01

# 总时间
steps = 10000

# 初始化数组
xs = np.zeros((steps + 1,))
ys = np.zeros((steps + 1,))
zs = np.zeros((steps + 1,))

# 设置初始条件
xs[0], ys[0], zs[0] = (0., 1., 1.05)

# 使用洛伦兹方程进行积分
for i in range(steps):
    dx, dy, dz = (
        sigma * (ys[i] - xs[i]),
        xs[i] * (rho - zs[i]) - ys[i],
        xs[i] * ys[i] - beta * zs[i]
    )
    xs[i + 1] = xs[i] + dx * dt
    ys[i + 1] = ys[i] + dy * dt
    zs[i + 1] = zs[i] + dz * dt

# 绘制图形
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot(xs, ys, zs, lw=0.5)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
ax.set_title("Lorenz Attractor")

plt.show()

### Python 实现蝴蝶优化算法 (BOA) 以下是基于参考文献提供的理论基础和伪代码实现的一个完整的 Python 版本的蝴蝶优化算法 (BOA)[^1]。该代码实现了初始化种群、计算适应度值以及更新位置的核心逻辑。 #### BOA 的核心参数说明 - `SearchAgents_no`: 种群大小(即蝴蝶数量)。 - `Max_iteration`: 迭代次数。 - `dim`: 搜索空间维度。 - `lb`, `ub`: 变量下界和上界。 - `f`: 需要优化的目标函数。 --- ```python import numpy as np def butterfly_optimization_algorithm(SearchAgents_no, Max_iter, dim, lb, ub, f): """ 蝴蝶优化算法的主要实现部分 参数: SearchAgents_no: 蝴蝶的数量 Max_iter: 最大迭代次数 dim: 维度数 lb: 下边界数组 ub: 上边界数组 f: 目标函数 返回: Gbest_positon: 全局最优解的位置 convergence_curve: 收敛曲线数据 """ # 初始化种群 Boundary_no = len(lb) if Boundary_no == 1: ub_new = np.ones(dim) * ub lb_new = np.ones(dim) * lb else: ub_new = ub lb_new = lb Positions = np.zeros((SearchAgents_no, dim)) for i in range(dim): Positions[:, i] = np.random.rand(SearchAgents_no) * (ub_new[i] - lb_new[i]) + lb_new[i] # 计算初始适应度值并找到全局最优解 fitness = np.array([f(Positions[i, :]) for i in range(SearchAgents_no)]) Gbest_score_index = np.argmin(fitness) Gbest_position = Positions[Gbest_score_index, :].copy() # 定义收敛曲线 convergence_curve = [] c0 = 0.1 # 控制系数c的变化范围 a = 0.98 # 减少因子a # 主循环 for t in range(Max_iter): r = np.random.uniform() # 随机数r用于决定局部或全局搜索模式 fi = c0 / ((t + 1)**a) # 自适应控制参数fi for i in range(SearchAgents_no): temp = Positions.copy() # 局部吸引模型 if r >= 0.5: D = abs(Gbest_position - Positions[i]) step_size = fi * np.exp(-D**2) * (Gbest_position - Positions[i]) temp[i] += step_size # 全局吸引模型 else: k = int(np.floor(SearchAgents_no * np.random.rand())) D_k = abs(temp[k] - Positions[i]) step_size = fi * np.exp(-D_k**2) * (temp[k] - Positions[i]) temp[i] += step_size # 边界约束处理 for j in range(dim): temp[i][j] = max(min(temp[i][j], ub[j]), lb[j]) # 更新个体的最佳位置 new_fitness = f(temp[i]) if new_fitness < fitness[i]: Positions[i] = temp[i] fitness[i] = new_fitness # 更新全局最佳位置 Gbest_score_index = np.argmin(fitness) if fitness[Gbest_score_index] < f(Gbest_position): Gbest_position = Positions[Gbest_score_index, :].copy() # 存储当前最优适应度值到收敛曲线 convergence_curve.append(f(Gbest_position)) return Gbest_position, convergence_curve # 测试目标函数:Sphere Function def sphere_function(x): """测试用的目标函数""" return sum(xi ** 2 for xi in x) if __name__ == "__main__": import matplotlib.pyplot as plt # 设置参数 SearchAgents_no = 30 Max_iter = 100 dim = 10 lb = [-100] * dim ub = [100] * dim best_position, curve = butterfly_optimization_algorithm( SearchAgents_no, Max_iter, dim, lb, ub, sphere_function ) print("Best Position:", best_position) print("Optimal Value:", sphere_function(best_position)) # 绘制收敛曲线 plt.plot(curve) plt.title('Convergence Curve') plt.xlabel('Iteration') plt.ylabel('Fitness') plt.show() ``` --- 此代码片段涵盖了以下几个方面: 1. 初始种群生成[^4]; 2. 基于随机概率 \( r \) 和自适应参数 \( fi \),分别采用局部吸引模型和全局吸引模型进行位置更新[^2]; 3. 使用 Sphere 函数作为示例目标函数验证算法性能[^1]。 --- ### 结果分析 运行以上代码后,程序会返回一组最优变量组合及其对应的最小化目标函数值,并绘制出随迭代次数变化的收敛曲线图。这有助于直观了解算法的寻优能力和稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB代码顾问

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值