Система Лоренца в 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 );
Это немного ускорило меня, хотя я не уверен, что это идеальный способ инициализации массива структуры.