Система Лоренца в MATLAB- создание симуляторов и фильмов

Я пытаюсь смоделировать траектории в системе Лоренца в MATLAB, в настоящее время использую следующий код -

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 ГБ - что, конечно, слишком много для этой симуляции.

Мой вопрос состоит из двух частей:

(1) Как мне управлять этим кодом, чтобы он работал более плавно?

(2) Как я могу сделать.avi файл траектории? Я долго пытался найти выход в интернете, но либо MATLAB, либо мой компьютер каждый раз сдавались.

Заранее спасибо!

1 ответ

Решение

Как уже упоминалось в моем комментарии выше: ваш код работает на моем ноутбуке без проблем ("старый" процессор i5, 8 ГБ памяти). Приблизительно 102 % нагрузки на процессор генерируется и около 55 % моей памяти используется в процессе генерации кадров.

Для записи ваших кадров в видеофайл используются следующие команды:

v = VideoWriter('LorenzAnimation.avi');
open(v);
writeVideo(v,F);
close(v);

Это выводит файл 47 секунд (C=1421 кадры, 30 кадров в секунду) длительность и кадры размером 1364 × 661 пикселей каждый. Файл составляет около 38 МБ. Генерация кадров и запись видео заняли на моей машине около 3 минут (используя tic/toc).

Я не могу рассказать вам много о загрузке процессора во время записи видео (варьируется от 5 до 400 %). Это заняло до 82 % моей памяти. Лучше не трогайте свою машину в этом процессе.

Примечание: убедитесь, что вы не меняете размер окна рисунка, так как все кадры должны быть одинакового размера, иначе MATLAB вернется с сообщением об ошибке.

Вещи, которые могут повлиять на "гладкость":

  • вы используете больший размер кадра, чем я
  • Вы не используете сжатое видео, как вы подходили к записи видео файла?
  • планировщик вашей операционной системы делает плохую / хорошую работу
  • ваша машина даже медленнее моей (маловероятно)

Редактировать: инициализация переменных, с которыми вы работаете (например, векторы и матрицы), часто ускоряется, так как вы предварительно выделяете память. Я пробовал это для процесса генерации кадра (где 540, 436, 3 следует заменить на размеры вашей рамы - вручную или автоматически

G = struct('cdata', uint8( zeros(540, 436, 3) ), 'colormap', []);
G = repmat( G, 1, C );

Это немного ускорило меня, хотя я не уверен, что это идеальный способ инициализации массива структуры.

Другие вопросы по тегам