0

我有一个完美运行的 ODE 系统。但是现在,我希望在每次迭代中,按升序对解向量进行排序。我尝试了很多方法,但我做不到。有谁知道该怎么做?

这是一个简化的代码:

function dtemp = tanque1(t,temp)
  for i=1:N
    if i==1
      dtemp(i)=(((-k(i)*At*(temp(i)-temp(i+1)))/(y))-(U*As(i)*(temp(i)-Tamb)))/(ro(i)*vol_nodo*cp(i));
    end
    if i>1 && i<N
      dtemp(i)=(((k(i)*At*(temp(i-1)-temp(i)))/(y))-((k(i)*At*(temp(i)-temp(i+1)))/(y))-(U*As(i)*(temp(i)-Tamb)))/(ro(i)*vol_nodo*cp(i));
    end
    if i==N
      dtemp(i)=(((k(i)*At*(temp(i-1)-temp(i)))/(y))-(U*As(i)*(temp(i)-Tamb)))/(ro(i)*vol_nodo*cp(i));
    end
  end
end

测试脚本:

inicial=343.15*ones(200,1);
[t temp]=ode45(@tanque1,0:360:18000,inicial);
4

1 回答 1

1

看起来你有三组不同的微分方程,具体取决于i解向量的索引。我认为您的意思不是“排序”,而是一种更有效的方式来实现您已经完成的工作-基本上是矢量化。如果我没有不小心打错字(你应该检查一下),下面应该做你需要的:

function dtemp = tanque1(t,temp)
    dtemp(1) = (-k(1)*At*(temp(1)-temp(2))/y-U*As(1)*(temp(1)-Tamb))/(ro(1)*vol_nodo*cp(1));
    dtemp(2:N-1) = (k(2:N-1).*(diff(temp(1:N-1))-diff(temp(2:N)))*At/y-U*As(2:N-1).*(temp(2:N-1)-Tamb))./(vol_nodo*ro(2:N-1).*cp(2:N-1));
    dtemp(N) = (k(N)*At*(temp(N-1)-temp(N))/y-U*As(N)*(temp(N)-Tamb))/(ro(N)*vol_nodo*cp(N));

您仍然需要定义N和其他参数,并确保将temp其作为列向量返回。您也可以尝试用关键字替换Nend这可能会更快。的两种用法diff使代码更短,但是,根据 的值N,它们也可以加快计算速度。它们可以替换为temp(1:N-2)-temp(2:N-1)temp(2:N-1)-temp(3:N)。可以将这些分解为单个矢量化方程,但如果您愿意,我会将其作为练习留给您尝试。

请注意,为了清楚起见,我还删除了许多不必要的括号。当您学习 Matlab 时,您将习惯于操作顺序并找出何时需要括号。

于 2013-06-25T22:52:32.073 回答