基于 matlab 的洛伦兹系统分岔图实现。 通过2种方法最大值法庞加莱截面法进行输出分岔在混沌动力学领域洛伦兹系统是一个经典的例子。今天咱就来聊聊如何在Matlab中通过两种方法——最大值法和庞加莱截面法实现洛伦兹系统的分岔图输出。洛伦兹系统简介洛伦兹系统由下面一组非线性微分方程描述\[\begin{cases}\frac{dx}{dt} \sigma(y - x) \\基于 matlab 的洛伦兹系统分岔图实现。 通过2种方法最大值法庞加莱截面法进行输出分岔\frac{dy}{dt} x(\rho - z) - y \\\frac{dz}{dt} xy - \beta z\end{cases}\]其中\(\sigma\)、\(\rho\) 和 \(\beta\) 是系统参数。最大值法实现分岔图代码实现% 参数设置 sigma 10; beta 8/3; rho_start 1; rho_end 40; rho_step 0.01; rho_values rho_start:rho_step:rho_end; num_points length(rho_values); max_z_values zeros(num_points, 1); for i 1:num_points rho rho_values(i); % 定义洛伦兹系统的微分方程 lorenz_eq (t, state) [sigma*(state(2)-state(1)); state(1)*(rho - state(3)) - state(2); state(1)*state(2) - beta*state(3)]; % 初始条件 initial_state [1; 1; 1]; % 时间范围 tspan 0:0.01:50; % 求解微分方程 [~, solution] ode45(lorenz_eq, tspan, initial_state); % 取最后一部分数据来计算最大值 last_part solution(end - 1000:end, 3); max_z_values(i) max(last_part); end % 绘制分岔图 figure; plot(rho_values, max_z_values, .); xlabel(\rho); ylabel(Max(z)); title(Lorenz System Bifurcation Diagram - Maxima Method);代码分析参数设置定义了 \(\sigma\) 和 \(\beta\) 的值同时设定了 \(\rho\) 的变化范围及步长。循环计算对每个 \(\rho\) 值定义洛伦兹系统的微分方程设置初始条件和时间范围然后使用ode45函数求解微分方程。获取最大值从解的最后一部分数据中获取 \(z\) 的最大值这部分数据被认为是系统达到稳定状态后的值。绘图最后将每个 \(\rho\) 值对应的 \(z\) 最大值绘制成图就得到了基于最大值法的分岔图。庞加莱截面法实现分岔图代码实现% 参数设置 sigma 10; beta 8/3; rho_start 1; rho_end 40; rho_step 0.01; rho_values rho_start:rho_step:rho_end; num_points length(rho_values); poincare_points cell(num_points, 1); for i 1:num_points rho rho_values(i); % 定义洛伦兹系统的微分方程 lorenz_eq (t, state) [sigma*(state(2)-state(1)); state(1)*(rho - state(3)) - state(2); state(1)*state(2) - beta*state(3)]; % 初始条件 initial_state [1; 1; 1]; % 时间范围 tspan 0:0.01:100; % 求解微分方程 [~, solution] ode45(lorenz_eq, tspan, initial_state); % 庞加莱截面条件y 0且dy/dt 0 y_values solution(:, 2); dydt_values solution(:, 1).*(rho - solution(:, 3)) - solution(:, 2); poincare_indices find(diff(sign(y_values)) 0 dydt_values(1:end - 1) 0); poincare_points{i} solution(poincare_indices, [1, 3]); end % 绘制庞加莱截面分岔图 figure; hold on; for i 1:num_points scatter(repmat(rho_values(i), size(poincare_points{i}, 1), 1), poincare_points{i}(:, 2), .); end xlabel(\rho); ylabel(z values on Poincare section (y 0, dy/dt 0)); title(Lorenz System Bifurcation Diagram - Poincare Section Method); hold off;代码分析参数与循环部分和最大值法类似先设置参数然后对每个 \(\rho\) 值求解洛伦兹系统的微分方程。庞加莱截面条件通过找到 \(y 0\) 且 \(\frac{dy}{dt} 0\) 的点这些点就构成了庞加莱截面。存储与绘图将每个 \(\rho\) 值对应的庞加莱截面上的点存储起来最后绘制在图上横坐标为 \(\rho\)纵坐标为庞加莱截面上的 \(z\) 值从而得到基于庞加莱截面法的分岔图。通过这两种方法我们能从不同角度观察洛伦兹系统随着参数 \(\rho\) 变化时的分岔行为在Matlab中实现起来还是很有趣的感兴趣的小伙伴可以自己动手试试说不定还能发现更多有意思的现象呢。
基于Matlab的洛伦兹系统分岔图实现
基于 matlab 的洛伦兹系统分岔图实现。 通过2种方法最大值法庞加莱截面法进行输出分岔在混沌动力学领域洛伦兹系统是一个经典的例子。今天咱就来聊聊如何在Matlab中通过两种方法——最大值法和庞加莱截面法实现洛伦兹系统的分岔图输出。洛伦兹系统简介洛伦兹系统由下面一组非线性微分方程描述\[\begin{cases}\frac{dx}{dt} \sigma(y - x) \\基于 matlab 的洛伦兹系统分岔图实现。 通过2种方法最大值法庞加莱截面法进行输出分岔\frac{dy}{dt} x(\rho - z) - y \\\frac{dz}{dt} xy - \beta z\end{cases}\]其中\(\sigma\)、\(\rho\) 和 \(\beta\) 是系统参数。最大值法实现分岔图代码实现% 参数设置 sigma 10; beta 8/3; rho_start 1; rho_end 40; rho_step 0.01; rho_values rho_start:rho_step:rho_end; num_points length(rho_values); max_z_values zeros(num_points, 1); for i 1:num_points rho rho_values(i); % 定义洛伦兹系统的微分方程 lorenz_eq (t, state) [sigma*(state(2)-state(1)); state(1)*(rho - state(3)) - state(2); state(1)*state(2) - beta*state(3)]; % 初始条件 initial_state [1; 1; 1]; % 时间范围 tspan 0:0.01:50; % 求解微分方程 [~, solution] ode45(lorenz_eq, tspan, initial_state); % 取最后一部分数据来计算最大值 last_part solution(end - 1000:end, 3); max_z_values(i) max(last_part); end % 绘制分岔图 figure; plot(rho_values, max_z_values, .); xlabel(\rho); ylabel(Max(z)); title(Lorenz System Bifurcation Diagram - Maxima Method);代码分析参数设置定义了 \(\sigma\) 和 \(\beta\) 的值同时设定了 \(\rho\) 的变化范围及步长。循环计算对每个 \(\rho\) 值定义洛伦兹系统的微分方程设置初始条件和时间范围然后使用ode45函数求解微分方程。获取最大值从解的最后一部分数据中获取 \(z\) 的最大值这部分数据被认为是系统达到稳定状态后的值。绘图最后将每个 \(\rho\) 值对应的 \(z\) 最大值绘制成图就得到了基于最大值法的分岔图。庞加莱截面法实现分岔图代码实现% 参数设置 sigma 10; beta 8/3; rho_start 1; rho_end 40; rho_step 0.01; rho_values rho_start:rho_step:rho_end; num_points length(rho_values); poincare_points cell(num_points, 1); for i 1:num_points rho rho_values(i); % 定义洛伦兹系统的微分方程 lorenz_eq (t, state) [sigma*(state(2)-state(1)); state(1)*(rho - state(3)) - state(2); state(1)*state(2) - beta*state(3)]; % 初始条件 initial_state [1; 1; 1]; % 时间范围 tspan 0:0.01:100; % 求解微分方程 [~, solution] ode45(lorenz_eq, tspan, initial_state); % 庞加莱截面条件y 0且dy/dt 0 y_values solution(:, 2); dydt_values solution(:, 1).*(rho - solution(:, 3)) - solution(:, 2); poincare_indices find(diff(sign(y_values)) 0 dydt_values(1:end - 1) 0); poincare_points{i} solution(poincare_indices, [1, 3]); end % 绘制庞加莱截面分岔图 figure; hold on; for i 1:num_points scatter(repmat(rho_values(i), size(poincare_points{i}, 1), 1), poincare_points{i}(:, 2), .); end xlabel(\rho); ylabel(z values on Poincare section (y 0, dy/dt 0)); title(Lorenz System Bifurcation Diagram - Poincare Section Method); hold off;代码分析参数与循环部分和最大值法类似先设置参数然后对每个 \(\rho\) 值求解洛伦兹系统的微分方程。庞加莱截面条件通过找到 \(y 0\) 且 \(\frac{dy}{dt} 0\) 的点这些点就构成了庞加莱截面。存储与绘图将每个 \(\rho\) 值对应的庞加莱截面上的点存储起来最后绘制在图上横坐标为 \(\rho\)纵坐标为庞加莱截面上的 \(z\) 值从而得到基于庞加莱截面法的分岔图。通过这两种方法我们能从不同角度观察洛伦兹系统随着参数 \(\rho\) 变化时的分岔行为在Matlab中实现起来还是很有趣的感兴趣的小伙伴可以自己动手试试说不定还能发现更多有意思的现象呢。