[已解决] for循环耗时太长

[复制链接]
宁辛 发表于 2021-11-20 23:49:05
怎么才能将左边的网格加细呢?比如左边网格为0.01,右边的是0.1,从而达到高效计算。
这是程序代码{
clcclear all

%有量纲的参数在正文123页
b =1;                                %buffer power of soil       1
D = 0.05;                          %effective diffusion coefficient of nutrient in soil          0.05 cm^2/d
r0 = 0.02;                          %fine root radius        0.02 cm
rx = 2;                               %half inter-root distance   2 cm
m = 0.05;                         %Rate of solute loss through immobilization by soil microbes and other losses  0.05 /d
jrmax = 5.6*10^(-7);             %Maximum root-N influx   0.0056 g N m^(-2) /d
k =  2.5;                             %Root absorbing power for nutrient  方程(2)    2.5 cm/d
v0 = 1;                                %Radial velocity of water at the root surface     1 cm/d
S=1.4*10^(-8);                                %Rate of supply of diffusible solute per unit soil volume        0.014 g N m^(-3) /d
cso=S/m;                       %initial concentration    附录2页
% t =20;                                           %            124页 图注中  20 day.
t =45;                                               %           45d 达到稳态



dr = (rx-r0)/1000;             % space step
r = r0:dr:rx;
dt =0.1*dr^2/D;                        % time step
t1 = 0:dt:t;
[k1,m1] = size(r);
[k1,n] = size(t1);
C(:,1) = cso*ones(m1,1);                % initial concentration



for j = 1:n  %时间

    if(m1<=2)
    C(1:m1,2) = C(1:m1,1);
    else
      for i = 2:m1-1  %空间
  C(i,2) =(1-dt./b.*m) .*C(i,1) +dt./b.*S+dt./dr.* (b*D+r0*v0)/(b.*r(1,i)).*(C(i+1,1)-C(i,1))+...
        dt.*(D.*(C(i-1,1) - 2.*C(i,1) + C(i+1,1)))./(dr.^2);
      end
%           C(1,2) =(b*D*jrmax-b.*C(2,2)*D*k+dr.*jrmax*k-dr*jrmax*v0+sqrt((b*D*(jrmax-C(2,2).*k)+dr.*jrmax*(k-v0)).^2+...
%                 4*b.*C(2,2)*D*jrmax*k.*(b*D-dr*v0)))./(2*(-b*D*k+dr.*k*v0));  %left boundary
          C(1,2) =(-b*D*jrmax+b.*C(2,2)*D*k-dr.*jrmax*k+dr*jrmax*v0+sqrt((b*D*(jrmax-C(2,2).*k)+dr.*jrmax*(k-v0)).^2+...
                4*b.*C(2,2)*D*jrmax*k.*(b*D-dr*v0)))./(2*(b*D*k-dr.*k*v0));  %left boundary
%           C(m1,2) = D*b./dr.*C(m1-1,2)./(-r0*v0/rx+D*b./dr);   
C(m1,2)=(dr/D*b).*C(m1-1,2).*(-r0*v0/rx+D*b./dr);

    end
    C(1:m1,1) = C(1:m1,2);             % uptdate to next time
hold on
end
%
ylim([0 1.1]);
% plot(r,C(:,1));  % r:有量纲,c有量纲。


plot(r,C(:,1)./cso);     % r:有量纲,c无量纲。
}

最佳答案


gywxd 发表于 2021-11-21 11:44:39
for 循环耗时长 基本上就两个办法, 1个 for循环各单次运算之间没有相关性 想法弄成  并行方式运行,
二 想法变化成 矩阵运算。
回复此楼

1 条回复


gywxd 发表于 2021-11-21 11:44:39
for 循环耗时长 基本上就两个办法, 1个 for循环各单次运算之间没有相关性 想法弄成  并行方式运行,
二 想法变化成 矩阵运算。
回复此楼
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表