我正在尝试在MATLAB中模拟Lorenz系统中的轨迹,目前正在使用以下代码 -
clear all
clf;
clc;
% Solution
[t1,x1] = ode45('g',[0 30],[0;2;0]);
[t2,x2] = ode45('g2',[0 30],[0;2.001;0]);
[C,h] = size(x2);
ang = 0;
for j = 1:C
p1(j,:)= x1(j,:);
p2(j,:)= x2(j,:); % Plot
plot3(p1(:,1),p1(:,2),p1(:,3),'k', p2(:,1),p2(:,2),p2(:,3),'r'); hold on;
plot3(p1(j,1),p1(j,2),p1(j,3),'ko','markerfacecolor','k');
plot3(p2(j,1),p2(j,2),p2(j,3),'rd','markerfacecolor','r'); hold off
axis([-20 20 -40 40 0 50])
axis off
set(gca,'color','none') % Rotation
camorbit(ang,0,[p1(1,1),p1(1,2),p1(1,3)])
ang = ang + (360/C); % Record
set(gcf, 'units','normalized','outerposition',[0 0 1 1])
F(j)= getframe(gcf);
end
movie(F)
clf;
close;
使用g,g2以相同的方式定义函数:
function xdot = g(t,x)
xdot = zeros(3,1);
sig = 10;
rho = 28;
bet = 8/3;
xdot(1) = sig*(x(2)-x(1));
xdot(2) = rho*x(1)-x(2)-x(1)*x(3);
xdot(3) = x(1)*x(2)-bet*x(3);
哪个是Lorenz系统。整个代码的目的是制作一个电影,其中两个初始状态的轨迹变化很小,以证明该系统的混沌行为。代码本身确实起作用,但是占用了我所有的计算机内存,并试图制作一个轨道的.avi文件,它抱怨超过7.5 GB - 这当然对此太过分了。模拟。
我的问题包括两部分:
(1)如何管理此代码以使其运行更顺畅?
(2)如何制作轨迹的.avi文件?我试图在互联网上找到一种方法很长一段时间,但无论是MATLAB还是我的电脑都放弃了。
提前致谢!
答案 0 :(得分:1)
正如我在上面的评论中已经提到的:您的笔记本电脑上的代码运行得非常顺利(“旧”i5处理器,8 GB内存)。在帧生成过程期间,生成了大约102%的CPU负载,并且使用了大约55%的内存。
要将帧写入视频文件,请使用以下命令:
v = VideoWriter('LorenzAnimation.avi');
open(v);
writeVideo(v,F);
close(v);
这将输出47秒(C=1421
帧,每秒30帧)持续时间的文件和每个大小为1364×661像素的帧。该文件大约38 MB。在我的机器上生成帧并写入视频大约需要3分钟(使用tic/toc
)。
我无法告诉你在视频写入过程中的CPU负载(在5到400%之间变化)。它花了大约82%的记忆。最好不要在此过程中触摸您的机器。
注意:确保不要更改图形窗口的大小,因为所有帧的大小必须相同,否则MATLAB将返回错误消息。
可能会影响“顺畅”的事情:
编辑:初始化您正在操作的变量(例如向量和矩阵)通常会在您预先分配内存时加快速度。我已经尝试过这个帧生成过程(其中540, 436, 3
应该由您的帧维度替换 - 手动或自动
G = struct('cdata', uint8( zeros(540, 436, 3) ), 'colormap', []);
G = repmat( G, 1, C );
这给了我一点点加速,但我不确定这是否是初始化结构数组的完美方式。