如何使用ODE按升序对每次迭代中的解决方案向量进行排序?

时间:2013-06-25 20:23:07

标签: matlab ode

我有一个完美的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);

1 个答案:

答案 0 :(得分: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作为列向量返回。您也可以尝试使用N关键字替换end,这可能会更快。 diff的两种用法使代码更短,但是,根据N的值,它们也可以加快计算速度。可以使用temp(1:N-2)-temp(2:N-1)temp(2:N-1)-temp(3:N)替换它们。有可能将它们折叠成单个矢量化方程式,但如果您愿意,我可以将其作为练习让您尝试。

请注意,为清晰起见,我还删除了许多不必要的括号。当你学习Matlab时,你将习惯order of operations并找出需要括号的时候。