Lorenz系统在MATLAB中制作模拟和电影

时间:2016-03-19 18:50:58

标签: matlab video memory simulation lorenz-system

我正在尝试在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还是我的电脑都放弃了。

提前致谢!

1 个答案:

答案 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 );

这给了我一点点加速,但我不确定这是否是初始化结构数组的完美方式。