Как ускорить построение графиков с помощью pause()?

#matlab #matlab-figure

#matlab #matlab-рисунок

Вопрос:

Я понимаю, что при построении уравнения для x итераций, когда вы используете паузу с десятичным числом, вы можете ускорить время, необходимое для перехода от одной итерации к следующей. Мой вопрос: есть ли способ ускорить это еще больше? По сути, я выполняю уравнение одномерной адвекции с наветренной стороны, и мой график работает довольно медленно, даже когда я ставлю паузу, скажем, 0,0001. Есть какие-нибудь советы по увеличению скорости этой программы для построения графиков или мне просто нужно позволить ей работать своим чередом. Вот код, который я использую:

 clear;
clc;
%Set initial values
xmin=0; 
xmax=1;
N=101; %Amount of segments
dt= 0.0001; % Time step
t=0; % t initial
tmax=2; % Run this test until t=2
u=1; %Velocity

dx = (xmax - xmin)/100 %finding delta x from the given information
x =xmin-dx : dx : xmax dx; %setting the x values that will be plugged in

h0= exp(-(x- 0.5).^2/0.01); %Initial gaussian profile for t=0
h = h0;
hp1=h0;
nsteps =tmax/dt; % total number of steps taken
for n=1 : nsteps
    h(1)=h(end-2); %Periodic B.C
    h(end)=h(2);

    for i =2 : N 1
        if u>0

            hp1(i) = h(i) - u*dt/dx *( h(i)-h(i-1)); %Loop to solve the FOU
        elseif u<0
            hp1(i) = h(i) - u*dt/dx*(h(i 1)-h(i)); %downwind
        end

    end

    t=t dt; %Increase t after each iteration
    h= hp1; %have the new hp1 equal to h for the next step
    initial= exp(-(x- 0.5).^2/0.01); % The initial plot when t =0
    %hold on
    plot(x,initial,'*') %plot initial vs moving
    plot(x,h,'o-')
    pause(0.0001);
    %hold off

    figure(2)
    plot(x,initial) %plot end value
end
  

Комментарии:

1. при pause замедлении вы делаете паузу. Вы ищете drawnow ?

2. @AnderBiguri в принципе, я хочу иметь возможность видеть каждую итерацию, но скорость должна быть немного выше, как предложено ниже, я рассмотрю возможность запуска этих циклов параллельно

3. plot Выполнение команды требует времени. Вам следует рассмотреть возможность использования низкоуровневого API, например, line для рисования линий вручную, и вы должны использовать set(...) для ручного обновления строк, представляющих ваши данные, что быстрее, потому что вам не нужно перерисовывать график на каждой итерации. Посмотрите в справке MATLAB примеры.

4. @James всегда разделяйте вычисления и построение графика, если это возможно. Создайте цикл для вычисления массива, затем, по завершении, создайте цикл для построения графика.

5. Если ваши вычисления выполняются медленно, а вы хотите красивую визуализацию, вам следует экспортировать результаты в виде анимации. Посмотрите, как я могу создавать анимированные GIF-изображения в MATLAB?

Ответ №1:

Не связано ли это «ускорение» с тем, что pause() очищает графический буфер событий, как drawnow, но, по-видимому, делает это быстрее? Таким образом, какую-либо работу выполняет не продолжительность паузы (на самом деле, я не думаю, что разрешение находится в миллисекундном диапазоне на многих машинах), а просто сама команда.

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

Комментарии:

1. Спасибо, я посмотрю, как выполнять эти циклы параллельно! Также никогда не была представлена функция drawnow, так что я тоже посмотрю на это!