在modelica中使用偏微分方程耦合系统

在modelica中使用偏微分方程耦合系统,modelica,Modelica,就几个问题,我希望有人能抽出时间回答:) 如果我们有耦合模型例子: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中表示相同的语法(我使用积分器,但不起作用)

就几个问题,我希望有人能抽出时间回答:)

如果我们有耦合模型例子: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中表示相同的语法(我使用积分器,但不起作用)

下面是一个代码(不起作用):

型号PDEtest
/*边界条件
1.δ(c)/δ(r)=0表示r=0
2.δ(c)/δ(r)=-j*d表示r=Rp*/
参数Real Rp=88*1e-3;//长度
参数Real initialConc=1000;
参数实际Dp=1e-14;
参数整数np=10;//点数
实际cp[np](开始=填充(初始浓度,np));
Modelica.Blocks.Continuous.Integrator r(k=1);//独立x1
Real j;
受保护的
参数Real dr=Rp/np;
参数实数ts=0.01;//用于使用when循环(样本(0,ts))
算法
j:=sin(时间);//这应该是独立变量,如x2
r、 u:=dr;
当r.y=0时,则为initialConc,否则为initialConc;
结束时;
注释(使用(Modelica(version=“3.2”));
结束PDEtest;
以下是更多的问题:

  • 此代码在OpenModelica 1.8.1中不起作用,在Dymola 2013demo中也不起作用。我们怎么能有变量c的continuos函数,而不是函数数组
  • 我们可以将数组cp的值放在combiTable中吗?怎么做
  • 如果取而代之的是“算法”停留在“方程”代码无法成功检查。为什么?在OpenModelica中,错误为:无法展平模型:S
  • 是否有任何简化的方法来使用一组耦合的方程(PDE)?我知道Modelica中的PDEs库,但我认为它们很复杂。我想写一个解偏微分方程的函数,并在“main model”中调用这些函数,这样函数的输出就是“c”的continuos函数。我不知道用函数数组做什么
  • 如果我们像在Matlab中那样“说话”,你能给我一些如何理解Modelica语言的建议吗?例如:自变量r的值,我们可以在Matlab中指定,比如r=0:TimeStep:Rp…如何在Modelica中进行相同的操作?请给我解释一下“方程”部分是如何工作的,它和Matlab有相似之处吗,还有必要的顺序方法吗? 干杯:)

  • 很难回答您的问题,因为您假设Modelica~Matlab,但事实并非如此。所以我不会评论你的代码,因为它确实错了。让我给你一个模型的例子。也许你可以把它作为起点

    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;
    
    你的进一步问题:

  • cp是一个连续变量,数组表示 每个离散点
  • 就我所知,你为什么要这么做 您想要的解决方案变量
  • 您应该尝试使用几乎总是方程部分 算法部分通常用于函数中。我很漂亮 当然你可以用方程式来表示你的欲望行为
  • 我不知道那个图书馆,但pde最难的是 离散化及其自身求解。你可能会遇到问题 在使用modelica工具求解pde时 Modelica工具没有针对偏微分方程的专门求解算法 请考虑进一步的参考。你可以 首先

  • 谢谢,示例很有帮助,您用示例回答了我的问题5:)。在解决Modelica中的偏微分方程时,库在这里是一个很重要的问题,因为既然MaMICA没有“基函数”的概念,那么在工具能够真正处理您的问题之前,您必须首先将问题离散成一组ODE(威利的答案提供了一个很好的例子)。因此,Modelica解决方案中不存在解决方案的空间可变性。换句话说,您的解决方案在时间上是连续的,但在空间上是离散的。通过重构基础基函数,您始终可以从离散值重构空间连续解。关于#3,重要的是要理解Modelica是一种声明性语言,而不是命令式语言。你的目标是用数学(而不是算法)来描述这个问题。我认为这是“讲MATLAB”与“讲Modelica”这两个问题的核心所在。一旦你习惯了它,这实际上是一个相当自由的变化。关于#4,我的经验是,对于椭圆和抛物线偏微分方程,在Modelica中通常不会有很多问题。然而,对于双曲型PDEs,由于CFL条件,您可能会遇到麻烦。最后,对于第5类,您可能会考虑购买一个副本(包括PDES、BTW的讨论)。我还计划在我的文章中讨论这个主题。StackOverflow不支持MathJax-like MathExchange,这让我非常难过。
    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;