首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >洛伦兹系统在MATLAB中的仿真和电影制作

洛伦兹系统在MATLAB中的仿真和电影制作
EN

Stack Overflow用户
提问于 2016-03-19 18:50:57
回答 1查看 257关注 0票数 1

我试图在MATLAB中模拟Lorenz系统中的轨迹,目前使用了以下代码-

代码语言:javascript
运行
复制
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以相同的方式定义:

代码语言:javascript
运行
复制
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.5GB--这对这个模拟来说当然太多了。

我的问题包括两部分:

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

(2)如何生成轨迹的.avi文件?很长一段时间以来,我一直试图在互联网上找到一种方法,但无论是MATLAB还是我的电脑每次都放弃了。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-19 19:49:27

正如我在上面的评论中提到的:您的代码在我的膝上型计算机(一个“旧”i5处理器,8GB内存)上运行得相当顺利。大约102 %的CPU负载是生成的,大约55 %的内存是在帧生成过程中使用的。

若要将帧写入视频文件,请使用以下命令:

代码语言:javascript
运行
复制
v = VideoWriter('LorenzAnimation.avi');
open(v);
writeVideo(v,F);
close(v);

这输出一个47秒的文件(C=1421帧,每秒30帧)持续时间和帧大小分别为1364×661像素。该文件约为38 MB。在我的机器上(使用tic/toc),生成帧和编写视频都花费了大约3分钟。

我不能告诉你在视频编写过程中的CPU负载(变化在5%到400 %之间)。它占用了我82 %的记忆。在这个过程中最好不要碰你的机器。

备注:确保不更改图形窗口的大小,因为所有帧都必须是相同的大小,否则MATLAB将返回错误消息。

影响“平滑性”的事物:

  • 你用的是比我大的框架尺寸
  • 您没有使用压缩视频,您是如何编写视频文件的?
  • 操作系统的调度器做得不好/做得好。
  • 你的机器甚至比我的慢(不太可能)

编辑:初始化您正在操作的变量(例如向量和矩阵)通常在预分配内存时加速。我已经在框架生成过程中尝试过了(在这个过程中,540, 436, 3应该被您的框架尺寸所取代-手动或自动地)。

代码语言:javascript
运行
复制
G = struct('cdata', uint8( zeros(540, 436, 3) ), 'colormap', []);
G = repmat( G, 1, C );

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36105743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档