%% 参数与求解
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