В настоящее время я пытаюсь использовать parfor для охвата ряда начальных условий для набора дифференциальных уравнений, решаемых ode45. Код работает отлично, используя два вложенных цикла, но я надеялся, что parfor может сделать процесс более эффективным. К сожалению, я столкнулся с проблемой, когда решатель может решить одну из комбинаций в матрице, представляющую начальные условия в диапазоне переменных, но остальные, похоже, имеют свои начальные значения, все заданные в 0, вместо указанных значений по начальным условиям. Возможно, это связано с тем, что мне нужно создать матрицу нулей («P»), в которую будут записаны результаты, возможно, переписывая начальные условия (?). Любая помощь будет принята с большой благодарностью.Подходящие начальные условия для набора ODE с использованием parfor
Спасибо, Kyle
function help(C, R)
A = 0.01;
B = 0.00;
C = [0.001,0.01];
D = 0.00;
R = [1e-10,1e-9];
[CGrid,RGrid] = meshgrid(C,R);
parfor ij = 1 : numel(CGrid)
c2 = [A; B; CGrid(ij); D; RGrid(ij)];
[t,c] = ode45('ode_sys',[0:1:300],c2);
for k=1:length([0:1:300])
for l=1:length(c2)
if c(k,l)<0
c(k,l)=0;
end
end
end
P = zeros(301,5,numel(R),numel(C));
temp = zeros(301,5);
temp(:,1) = c(:,1);
temp(:,2) = c(:,2);
temp(:,3) = c(:,3);
temp(:,4) = c(:,4);
temp(:,5) = c(:,5);
P(:,:,ij)=temp;
parsave('data.mat', P);
end
end
Спасибо за помощь! К сожалению, мне нужно использовать parfor, чтобы иметь возможность решить мою систему уравнений в разумные сроки. Кроме того, кажется, что matlab требует размещения кода P = zeros (... внутри цикла parfor, который, по-видимому, заставляет перезаписывать переменные начальные условия, которые я пытаюсь решить для. – ksm
В этом случае попробуйте 'P = нули (301 , 5, numel (R) * numel (C)); 'с' parfor'. – David