我有一个完美的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);
答案 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并找出需要括号的时候。