0

我目前正在尝试使用 parfor 扫描一系列由 ode45 求解的微分方程的初始条件。该代码使用两个嵌套的 for 循环可以正常工作,但我希望 parfor 可以使该过程更高效。不幸的是,我遇到了一个问题,即求解器能够求解矩阵中表示一系列变量的初始条件的组合之一,但其他组合的初始值似乎都设置为 0,而不是指定的值由初始条件。这可能与我需要创建一个零矩阵('P')的事实有关,结果将被写入,可能会覆盖初始条件(?)任何帮助将不胜感激。

谢谢,凯尔

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
4

1 回答 1

0

你有一个错误,还有一些简化代码的机会。

parfor循环中,您有这一行,它在每次迭代时用全零P = zeros(301,5,numel(R),numel(C));覆盖。P把它放在parfor循环之前。

第一个for使负元素c为零的双循环可以使用 来完成max(c,0),这应该更有效。也可以P(:,:,ij)=c(:,1:5)直接做。

所以你可以parfor

P = zeros(301,5,numel(R),numel(C));
for ij = 1 : numel(CGrid)
    c2 = [A; B; CGrid(ij); D; RGrid(ij)];
    [t,c] = ode45('ode_sys',0:300,c2);
    c = max(c,0);
    P(:,:,ij) = c(:,1:5);
    parsave('data.mat',P);
end
于 2016-03-11T01:40:49.380 回答