matlab制作洛伦兹吸引子曲线动画
ZZZQ小朋友
2024年10月20日 22:14

%% 参数与求解

sigma = 10; % Lorenz函数的参数

rho = 28; % Lorenz函数的参数

beta = 8/3; % Lorenz函数的参数

time_step_num = 200001; % 总的时间步数

t_span = linspace(0,200,time_step_num)';

num_line = 5; % 求解的线条数量

for i = 1:num_line

xyz0= [1;1;1] + (rand(3,1)-0.5); % 初始值给个随机

[~,xyz_cal(:,:,i)]=ode45(@(t,xyz)Lorenz(t,xyz,sigma,rho,beta),t_span,xyz0); % 求解Lorenz函数

end

%% 设置坐标轴

% 位置、图框背景颜色

f = figure(Units='normalized',Position=[0.1,0.1,0.8,0.8],Color=[0 0 0]);

ax = axes(f,FontSize=15,LineWidth=1.5);

% xyz轴不可见

ax.XAxis.Visible = 'off';

ax.YAxis.Visible = 'off';

ax.ZAxis.Visible = 'off';

% xyz轴范围

ax.XLim=[-20,20];

ax.YLim=[-30,30];

ax.ZLim=[0,50];

% 显示外框,设置外框透明度

ax.Box = 'on';

ax.XColor=[1,1,1]*0.1;

ax.YColor=[1,1,1]*0.1;

ax.ZColor=[1,1,1]*0.1;

% ax.BoxStyle = "full";

% ax.DataAspectRatio=[1,1,1];

ax.Color = [0 0 0]; % 坐标区背景颜色

ax.View = [-159,18];

line_width = 1; % 曲线线宽

marker_size = 5; % 标记大小

line_color = [0.3010 0.7450 0.9330]; % 曲线颜色

hold on

for i = 1:num_line

% Line(i) = plot3(0,0,0,LineWidth=line_width,Color=line_color); % 线条颜色相同

Line(i) = plot3(0,0,0,LineWidth=line_width); % 线条颜色不同

Point(i) = plot3(0,0,0,Marker='o',MarkerSize=marker_size,MarkerFaceColor=line_color,MarkerEdgeColor='none');

end

%% 曲线动画

% 即扫描Lorenz函数的解,实现动态效果

start_time_step = 500;

during_time_step = 20000;

rand_interval = round(rand(num_line,1))*10000;

fn = 0;

im = {};

for j = start_time_step : 10 : time_step_num-max(rand_interval)-during_time_step

for i = 1:num_line

start_time_step_rand = j+rand_interval(i);

Line(i).XData = xyz_cal(start_time_step_rand:start_time_step_rand+during_time_step,1,i);

Line(i).YData = xyz_cal(start_time_step_rand:start_time_step_rand+during_time_step,2,i);

Line(i).ZData = xyz_cal(start_time_step_rand:start_time_step_rand+during_time_step,3,i);

Point(i).XData = Line(i).XData(end);

Point(i).YData = Line(i).YData(end);

Point(i).ZData = Line(i).ZData(end);

end

ax.View = [-159+j/100,18];

drawnow

% frame = getframe(f);

% fn = fn + 1;

% im{fn} = frame2im(frame);

end

% path = 'C:\Users\ZQ\OneDrive\Matlab\洛伦兹吸引子\ani\';

% name = 'animation';

% for i = 1:length(im)

% full = [path,name,'_',num2str(i),'.png'];

% imwrite(im{i}, full);

% end

%% Lorenz函数

function dxyz=Lorenz(t,xyz,sigma,rho,beta)

% 三个常微分方程,组成的方程组

x = xyz(1);

y = xyz(2);

z = xyz(3);

dxdt = sigma*(y-x);

dydt = rho*x-y-x.*z;

dzdt = x.*y-beta*z;

dxyz = [dxdt;dydt;dzdt];

end