Michael M. Tiller《Modelica多领域物理系统建模入门与提高》Chapter 6学习笔记

第六章 数组

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个导数

6.5.5 针对数组的内置函数

数组操作内置函数

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值