我试图在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.5GB--这对这个模拟来说当然太多了。
我的问题包括两部分:
(1)如何管理此代码以使其运行更顺利?
(2)如何生成轨迹的.avi文件?很长一段时间以来,我一直试图在互联网上找到一种方法,但无论是MATLAB还是我的电脑每次都放弃了。
提前感谢!
发布于 2016-03-19 19:49:27
正如我在上面的评论中提到的:您的代码在我的膝上型计算机(一个“旧”i5处理器,8GB内存)上运行得相当顺利。大约102 %的CPU负载是生成的,大约55 %的内存是在帧生成过程中使用的。
若要将帧写入视频文件,请使用以下命令:
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应该被您的框架尺寸所取代-手动或自动地)。
G = struct('cdata', uint8( zeros(540, 436, 3) ), 'colormap', []);
G = repmat( G, 1, C );这给了我一些速度,虽然我不确定这是否是初始化结构数组的完美方法。
https://stackoverflow.com/questions/36105743
复制相似问题