2012-11-28 58 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”的核心问题。一旦你习惯了它,它实际上是一种解放的变化。 –