2013-06-25 18 views
0

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

我不明白爲什麼要對解決方案向量進行排序,這似乎會使您的解決方案無法使用。對不起,我不明白。爲什麼你想排序解決方案矢量? – macduff

回答

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返回爲一個列向量。您也可以嘗試用end關鍵字替換N,這可能會更快。 diff這兩個用法使得代碼更短,但根據N的值,它們也可以加快計算速度。它們可以用temp(1:N-2)-temp(2:N-1)temp(2:N-1)-temp(3:N)來代替。將它們摺疊成一個矢量化的等式也許是可能的,但如果你願意的話,我會把它作爲一個練習讓你嘗試。

請注意,爲了清楚起見,我還刪除了很多不必要的括號。當你學習Matlab時,你將習慣order of operations並找出何時需要括號。