文章目录
第六章 数组
6.1 概念
数组及数组操作的控制语句(if、for、while)
- 标量数组:数学对象,如矢量(一维数组)和矩阵(二维数组)
- 组件数组:电阻实例数组或record实例数组
6.2 组件数组应用示例:行星运动
6.2.1 连接器
connector BodyAttachment
import Modelica.SIunits;
SIunits.Position x[3];
flow SIunits.Force f[3];
SIunits.Mass m;
end BodyAttachment;
6.2.2 三维空间中的物体定义
在外力作用下的行为模型定义:牛顿第二定律
model Body //模型行为描述
import Modelica.SIunits;
parameter SIunits.Mass M=1.0;
parameter SIunits.Velocity init_v[3]={0,0,0};
parameter SIunits.Position init_x[3]={0,0,0};
BodyAttachment b;
protected
SIunits.Position x[3](start=init_x,fixed=true);
SIunits.Velocity v[3](start=init_v,fixed=true);
SIunits.Acceleration a[3];
equation
b.x=x;
b.m=M;
v=der(x);
a=der(v);
M*a=b.f;
end Body;
6.2.3 万有引力
// 计算万有引力的函数
function CalcForce "Calculate Force on body1 due to body2"
import Modelica.SIunits;
input SIunits.Position body1[3];
input SIunits.Mass M1;
input SIunits.Position body2[3];
input SIunits.Mass M2;
output SIunits.Force on_body1[3];
protected
SIunits.Distance r;
SIunits.Force F;
algorithm
r:=sqrt((body1[1]-body2[1])^2+(body1[2]-body2[2])^2+(body1[3]-body2[3])^2);
F:=M1*M2*Modelica.Constants.G/r^2;
on_body1:=F*(body2-body1)/r;
end CalcForce;
// 万有引力作用模型构建
model GravitationalAttraction
BodyAttachment b1,b2;
equation
b1.f=-CalcForce(b1.x,b1.m,b2.x,b2.m);
b2.f=-b1.f;
end GravitationalAttraction;
//万有引力计算函数进行封装
model GravitationalAttraction
BodyAttachment b1,b2;
protected
function CalcForce "Calculate Force on body1 due to body2"
import Modelica.SIunits;
input SIunits.Position body1[3];
input SIunits.Mass M1;
input SIunits.Position body2[3];
input SIunits.Mass M2;
output SIunits.Force on_body1[3];
protected
SIunits.Distance r;
SIunits.Force F;
algorithm
r:=sqrt((body1[1]-body2[1])^2+(body1[2]-body2[2])^2+(body1[3]-body2[3])^2);
F:=M1*M2*Modelica.Constants.G/r^2;
on_body1:=F*(body2-body1)/r;
end CalcForce;
equation
b1.f=-CalcForce(b1.x,b1.m,b2.x,b2.m);
b2.f=-b1.f;
end GravitationalAttraction;
在modelica中,定义两个同名(全限定名)的函数是非法的,避免出现这种情况的方法是在使用函数的模型中声明函数。
6.2.4 多体仿真
// 地球与太阳
model BinarySystem
Body sun(M=1.989e+30);
Body earth(M=5.976e+24,init_v={0,29.29e+3,0},init_x={152.1e+9,0,0});
GravitationalAttraction earth_sun;
equation
connect(earth_sun.b1,sun.b);
connect(earth_sun.b2,earth.b);
end BinarySystem;
// 地球、月亮、太阳
model TernarySystem
extends BinarySystem;
Body moon(M=7.349e+22,init_v={0,2929e+1020,0},init_x={152484e+6,0,0});
GravitationalAttraction moon_earth;
GravitationalAttraction moon_sun;
equation
connect(moon_earth.b1,moon.b);
connect(moon_earth.b2,earth.b);
connect(moon_sun.b1,moon.b);
connect(moon_sun.b2,sun.b);
end TernarySystem;
6.3 一个简单的一维热传递示例:变量数组的使用
6.3.1 控制方程
能量守恒
6.3.2 基于方程的方法
6.3.3 基于组件的方法
//连接器定义
connector ThermalNode
Modelica.SIunits.Temp_K T(start=300);
flow Modelica.SIunits.HeatFlowRate q;
end ThermalNode;
//热传导
model ThermalConduction "1-D Conduction Heat Transfer"
import Modelica.SIunits;
parameter SIunits.ThermalConductivity k=1.0;
parameter SIunits.Length L=1.0;
parameter SIunits.Area A=1.0;
//连接器
ThermalNode a,b;
equation
a.q=A*k*(a.T-b.T)/L;
b.q=-a.q;
end ThermalConduction;
//热容
model ThermalCapacitance "Capacitance of a rod section"
ThermalNode p "Midpoint connection";
parameter Modelica.SIunits.SpecificHeatCapacity cp;
parameter Modelica.SIunits.Density rho;
parameter Modelica.SIunits.Length L;
parameter Modelica.SIunits.Area A;
protected
parameter Modelica.SIunits.Volume V=A*L;
equation
V*cp*rho*der(p.T)=p.q;
end ThermalCapacitance;
//固定边界温度条件
//表示固定温度的组件模型,狄利克雷边界条件
model FixedTemperature
modelica.Blocks.Interfaces.InPort T(final n=1);
ThermalNode d;
equation
d.T=T.signal[1];
end FixedTemperature;
//传导杆单元
model ConductingRod
import Modelica.SIunits;
parameter SIunits.Length L=1.0 "Total Length";
parameter SIunits.Area A=1.0 "Cross-sectional area";
parameter SIunits.SpecificHeatCapacity cp=1.0;
parameter SIunits.Density rho=1.0;
parameter SIunits.ThermalConductivity k=1.0;
parameter Integer n=10 "number of sections";
ThermalNode a,b;//External connections
protected
parameter SIunits.Length dx=L/n;
ThermalCapacitance cap[n](L=dx,A=A,rho=rho,cp=cp);
ThermalConduction c_cond[n-1](L=dx,A=A,k=k);
ThermalConduction 1_cond(L=dx/2,A=A,k=k);
ThermalConduction r_cond(L=dx/2,A=A,k=k);
equation
for i in 1:n-1 loop
connect(c_cond[i].a,cap[i].p);
connect(c_cond[i].b,cap[i+1].p);
end for;
connect(a,1_cond.a);
connect(1_cond.b,cap[1].p);
connect(b,r_cond.b);
connect(r_cond.a,cap[n].p);
end ConductingRod;
//带有边界条件的热传导杆模型
model HTProblem1
Modelica.Blocks.Source.Constant T1(k={300.0});
Modelica.Blocks.Source.Step Tr(height={700.0},offset={300.0},startTime={10.0});
FixedTemperature left,right;
ConductingRod rod(n=10,L=10.0,k=1.0,cp=1.0,rho=1.0);
equation
connect(T1.outPort,left.T);
connect(Tr.outPort,right.T);
connect(left.d,rod.a);
connect(right.d,rod.b);
end HTProblem1;
//增加热对流模型
model ThermalConvection
import Modelica.SIunits;
parameter SIunits.CoefficientOfHeatTransfer h=1.0;
parameter SIunits.Area A=1.0;
ThermalNode a,b;
equation
a.q=A*h*(a.T-b.T);
b.q=-a.q;
end ThermalConvection;
//增加热对流效应
model ConductingRodWithConvection
import Modelica.SIunits;
extends ConductingRod;
parameter SIunits.Length perimeter=1.0;
parameter SIunits.CoefficientOfHeatTransfer h=1.0;
ThermalNode ambient;
protected
parameter SIunits.Area As=perimeter*dx;
ThermalConvection conv[n](h=h,A=As);
equation
for i in 1:n loop
connect(cap[i].p,conv[i].a);
connect(ambient,conv[i].b);
end for ;
end ConductingRodWithConvection;
//包含传导和对流的传热问题
model HTProblem2
Modelica.Blocks.Source.Constant T1(k={300.0});
Modelica.Blocks.Source.Constant Tinf(k={600.0});
Modelica.Blocks.Source.Step Tr(height={700.0},offset={300.0},startTime={10.0});
FixedTemperature left,right,wall;
ConductingRodWithConvection rod(n=10,L=10.0,k=1.0,cp=1.0,rho=1.0,h=0.3);
equation
connect(T1.outPort,left.T);
connect(Tr.outPort,right.T);
connect(Tinf.outPort,wall.T);
connect(left.d,rod.a);
connect(right.d,rod.b);
connect(wall.d,rod.ambient);
end HTProblem2;
6.5 语言基础
6.5.1 信息隐藏
protected
关键字:对模型使用者隐藏一些变量和参数
- 放在保护区域的元素不能被外部所参考,使得模型开发者在后期开发过程中,可以自由地改变一些执行的细节,而不用担心与依赖这些模型的已有模型发生冲突
- 通过隐藏模型的细节,模型的接口变简单,更易于使用
- 缺点是无法从外部改变
6.5.2 数组
6.5.2.1 标量数组
//数组的声明
Real x[5];
//设置控制数组大小的参数
parameter Integer x_size=5;
Real x[x_size];
//初始化时再给定数组大小
model Beam
parameter Real x[:];
...
end Beam;
Beam b(x={0.2,0.77,0.92});
//初始化方式
parameter Real x[5]={0.1,0.3,0.5,0.7,0.9};
parameter Real y[:]=x;//显性数组直接初始化
parameter Real z[:]=0.1:0.2:0.9;//步长0.2
parameter Integer evens[:]=2:2:10;
6.5.2.2 数组和属性
Real x[5](start={0.1,0.3,0.5,0.7,0.9});
//数组的属性也是数组
6.5.2.3 组件数组
modelica允许声明元素为组件的数组,增加了把本构方程应用到许多变量的灵活性
6.5.2.4 多维度数组
Real x[5,2,7,8,12];//每一维用逗号隔开
//多维数组初始化
Real x[2,3]={{1,2,3},{4,5,6}};
Real x[2,3]={1:3,4:6};
6.5.3 循环和方程式
方程代码中的循环,包含在循环体中的语句是方程式,而不是赋值语句
6.5.4 高级数组处理特征
- 可使用与Matlab相同的数组处理方法
- 表示转移函数
Real x;
Real dx[5];
equation
x=Modelica.Math.Sin(time);
dx[1]=der(x);
dx[2:5]=der(dx[1:4]);
//构建一个矢量dx[i],表示对x的第i个导数