【问题标题】:Lorenz System in MATLAB- making of simulation and movieMATLAB中的洛伦兹系统——制作模拟和电影
【发布时间】:2016-03-19 18:50:57
【问题描述】:

我正在尝试在 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);

洛伦兹系统。整个代码的目的是制作两个初始状态变化很小的轨迹的电影,以展示该系统的混沌行为。代码本身确实有效,但占用了我计算机的所有内存,并且在尝试制作轨迹的 .avi 文件时,它抱怨超过 7.5 GB——这对于这个模拟来说当然太多了。

我的问题由两部分组成:

(1) 如何管理此代码以使其运行更顺畅?

(2) 如何制作轨迹的.avi 文件?我在网上找了半天的方法,但是每次都是MATLAB或者我的电脑都放弃了。

提前致谢!

【问题讨论】:

  • 嗨。函数g2的定义是什么。如果是一样的..你为什么用不同的名字?
  • 当我运行你的代码时,F(j) 是一个带有元素 cdata: [686x1048x3 uint8] 的结构。 j1 循环到 C=1421。代码在我的机器上运行得非常顺利。也许压缩是个问题?编辑:它也播放流畅..
  • 另外,如果您有内存问题,您可以每帧保存帧,以便存储它们
  • @MatthiasW。完全一样,可能你是对的
  • @AnderBiguri 感谢您的建议。我如何才能做到这一点并且仍然能够制作这种模拟的电影?

标签: matlab video memory simulation lorenz-system


【解决方案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 );

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

【讨论】:

  • 感谢您的回答!回答完这个问题后我有几个问题:如何更改帧大小?压缩视频是通过给“writevideo”命令一个额外的参数来完成的,我正确吗?亲切的问候。
  • @tobiasmulder 不客气。框架大小取决于您的图形/绘图大小。检查F = getframe 的输出 - 您可以从命令行调用它,调整窗口大小并重复。 cdata 的输出包含维度,例如cdata: [518x1000x3 uint8]。在我的系统上:在第一个 plot3 命令之后:344x436x3,第二个和第三个保持不变。 set(gcf, 'units',... 命令将其设置为540x1060x3(可能是全尺寸,我没有检查您的命令背后的含义[s])。对于压缩,请查看writeVideo (doc writeVideo) 的手册,但我会说是的。
  • @tobiasmulder 我还编辑了我的帖子,并提出了一些加速建议。您能否在您的机器上试一试,也许还可以检查并告诉我们您的执行时间和框架尺寸。
猜你喜欢
  • 2022-01-22
  • 2020-02-23
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多