2012-11-28 57 views
3

只有幾個問題,我希望有人會抽空回答:)。在模式中使用偏微分方程耦合系統

如果我們有COUPLED模型的例子:n個獨立變量X和n的非線性偏微分方程系統PDEf(X,PDEf(X))相對於時間的依賴於X,PDEf(X)(偏微分方程取決於變量X)。你能提出一些建議嗎?這裏有一個例子:

比方說,c是輸出,或所需的變量。假設r是自變量。部分微分方程如下:

∂c/∂t= D * 1/r +∂c/∂r+ 2(D *(∂^ 2 c)/(∂r^ 2)) D =常量 r = 0:0.1:Rp- Matlab語法,如何在Modelica中表示相同的值(我用積分器,但沒有工作)?

下面是一個代碼(不工作):

model PDEtest 
/* Boundary conditions 
1. delta(c)/delta(r)=0 for r=0 
2. delta(c)/delta(r)=-j*d for r=Rp*/ 
parameter Real Rp=88*1e-3; // length 
parameter Real initialConc=1000; 
parameter Real Dp=1e-14; 
parameter Integer np=10; // num. of points 
Real cp[np](start=fill(initialConc,np)); 
Modelica.Blocks.Continuous.Integrator r(k=1); // independent x1 
Real j; 
protected 
parameter Real dr=Rp/np; 
parameter Real ts= 0.01; // for using when loop (sample(0,ts)) 
algorithm 
j:=sin(time); // this should be indepedent variable like x2 
r.u:=dr; 
while r.y<=Rp loop 
for i in 2:np-1 loop 
der(cp[i]):=2*Dp/r.y+(cp[i]-cp[i-1])/dr+2*(Dp*(cp[i+1]-2*cp[i]+cp[i-1])/dr^2); 
end for; 
if r.y==Rp then 
cp[np]:=-j*Dp; 
end if; 
cp[1]:=if time >=0 then initialConc else initialConc; 
end while; 
annotation (uses(Modelica(version="3.2"))); 
end PDEtest; 

這裏有更多的問題:

  1. 這個代碼不OpenModelica 1.8.1工作,也不要在工作Dymola 2013demo。我們怎樣纔能有變量c的連續函數,而不是函數數組?
  2. 我們可以將數組cp的值放在combiTable中嗎?如何?
  3. 如果改爲「算法」停留「方程」代碼不能成功檢查。爲什麼?在OpenModelica中,錯誤是:無法展平模型:S。
  4. 有沒有簡化的方法來使用一組耦合的方程(PDE)?我知道Modelica中的PDE庫,但我認爲它們很複雜。我想編寫一個解決PDE的函數,並在「主模型」中調用這些函數,以便函數的輸出是「c」的連續函數。我不知道用函數的數組做什麼。
  5. 如果我們能像Matlab一樣「說話」,您能否告訴我如何理解Modelica語言?例如:自變量r的值,我們可以在Matlab中specife,如r = 0:TimeStep:Rp ...如何在Modelica中做同樣的事情?請解釋一下「方程」部分是如何工作的,是否與Matlab有相似之處,並且是否有必要採用財務方法? 乾杯:)
+0

這是可悲的多少困擾我的是StackOverflow上不支持MathJax像MathExchange。 – kleineg

回答

5

這是很難回答你的問題,因爲你假設的Modelica〜Matlab的,但事實並非如此。所以我不會評論你的代碼,因爲它確實是錯誤的。讓我給你一個burger equation的示例模型。也許你可以用它作爲出發點。

model burgereqn 
Real u[N+2](start=u0); 
parameter Real h = 1/(N+1); 
parameter Integer N = 10; 
parameter Real v = 234; 
parameter Real Pi = 3.14159265358979; 
parameter Real u0[N+2]={((sin(2*Pi*x[i]))+0.5*sin(Pi*x[i])) for i in 1:N+2}; 
parameter Real x[N+2] = { h*i for i in 1:N+2}; 
equation 
der(u[1]) = 0; 
for i in 2:N+1 loop 
    der(u[i]) = - ((u[i+1]^2-u[i-1]^2)/(4*(x[i+1]-x[i-1]))) 
       + (v/(x[i+1]-x[i-1])^2)*(u[i+1]-2*u[i]+u[i+1]); 
end for; 
der(u[N+2]) = 0; 
end burgereqn; 

你的進一步的問題:

  1. CP是連續可變的,並且該陣列被表示 每離散點。
  2. 爲什麼你應該這樣做,據我所知,CP是 你想要的解決方案變量。
  3. 你應該儘量使用幾乎總是方程節 算法部分通常用於功能。我很漂亮 確定你可以用方程來表示你的慾望行爲。
  4. 我不知道那個庫,但是在pde上的難點是離散化和解決它自身。您可能會遇到的問題 同時解決了的Modelica工具的PDE,因爲通常 一個Modelica的工具對偏微分方程沒有專門的求解算法。
  5. 請考慮該問題的進一步參考。你可以 開始Modelica.org
+0

謝謝你,例子很有幫助,你用例子回答了我一個問題5 :)。和庫是在這裏https://www.modelica.org/libraries/PDELib – Anel

+2

解決Modelica的偏微分方程時要考慮的重要一點是,由於Modelica的不具有的「基礎功能」的一個概念,你必須先離散您的問題在工具可以真正處理您的問題之前,將它們集成到一組ODE中(Willi的答案提供了一個很好的例子)。因此,您的解決方案的空間可變性在Modelica解決方案中不存在。換句話說,你的解決方案將在時間上連續,但在空間上是離散的。通過重構基礎函數,您可以始終從離散值重建空間連續解。 –

+1

關於#3,重要的是要明白,Modelica是一種聲明性語言,而不是一種命令式語言。你的目標是用數學(而不是算法術語)來描述問題。我認爲這是「講MATLAB」與「講Modelica」的核心問題。一旦你習慣了它,它實際上是一種解放的變化。 –