Matlab `parfor` для простых кинематических расчетов - PullRequest
0 голосов
/ 25 мая 2019

Я буду использовать эту простую самодостаточную функцию, которая должна получать в качестве входных данных: начальную позицию, силу, шаг по времени и количество итераций; и вернуть в качестве выходных данных: векторы времени и положения.

function [time,pos] = example(pos0, force, N, dt) 

clc;

pos = zeros(N+1,3);
vel = zeros(N,3);
pos(1,:)=pos0;


for i = 1:N

        time(i+1) = i*dt;

        % solver finds the velocities given forces and previous positions
        vel(i,:) = force./(norm(pos(i,:)+1));

        % evolution calculates new positions using new velocities
        pos(i+1,:) = pos(i,:) + vel(i,:)*dt;

end

end

Я бы хотел вычислить это с помощью пула пареллов - в моем случае, состоящего из 2 ядер. Измененный код ниже не работает из-за способа использования переменной pos, которая делает так, чтобы каждая итерация зависела от предыдущей. Как я мог это исправить? Я прочитал документацию, но она для меня довольно неясна даже для таких простых случаев. Можно ли вообще это распараллелить?

function [time,pos] = example(pos0, force, N, dt) 

clc;
delete(gcp('nocreate'));

pos = zeros(N+1,3);
vel = zeros(N,3);
pos(1,:)=pos0;

parpool(2)

parfor i = 1:N

        time(i+1) = i*dt;

        % solver finds the velocities given forces and previous positions
        vel(i,:) = force./(norm(pos(i,:)+1));

        % evolution calculates new positions using new velocities
        pos(i+1,:) = pos(i,:) + vel(i,:)*dt;

end

end
...