第二天的学习有点偷懒,那天其实是看完第一章了,但是由于知识点比较零散,不知道用什么方式呈现给大家,所以就没有写,今天来认真总结一下。
注:本人只是将书中个人认为比较重要的部分列出,再誊抄的过程中如果有问题欢迎各位大佬指正,看到后会第一时间改正!
Modelica语言学习
第一章——概述
该软件主要用途之一就是仿真,仿真的必要性主要有以下几个方面:
(1)试验过于昂贵、过于危险,或者被试验的系统尚不存在。这些是对真实系统进行试验的主要困难。
(2)系统动力学的时间尺度与试验者的不匹配。例如,需要几百万年的时间来观察宇宙演变中很小的变化,而类似的变化可以在宇宙的计算机仿真中快速观察到。
(3)变量可能无法访问。在仿真中所有的变量都能被研究和控制,即使是那些在真实系统无法访问的变量。
(4)模型易于操控。采用仿真,容易操控系统模型中的参数,甚至在特定物理系统的可行域外操控参数。例如,在计算机仿真模型中,通过敲一下键盘可以将物体质量从40kg增加到500kg,而这种变化在物理系统中可能是难以实现的。
(5)抑制干扰。在模型的仿真中,可以抑制在真实系统测量中可能无法避免的干扰。这使得我们隔离某些特定影响因素,从而更好地理解它们。
(6)抑制二阶效应。通过执行仿真来抑制二阶效应,如小的非线性或某些系统组件的其他细节,可以帮助我们更好地理解主要影响因素。
但是仿真也有一些不足,在工程中至少将模型仿真中一部分结果与实际系统试验的结果进行对比,常见的三种仿真问题有:
(1)模型并不是实际的世界,只能在特定的条件下表示实际系统。
(2)不能不略人类行为、社会和自然等许多其他的重要方面。
(3)忽略模型的精度。
第二章——Modelica简介
2.1 Modelica入门
例:Modelica编写x' = - a · x
// 定义一个名为 HelloWorld 的模型
model HelloWorld
// 声明一个实数变量 x,初始值(start)设为 1
Real x( start = 1);
// 声明一个参数 a,类型为实数(Real),固定值设为 1
// parameter 表示仿真过程中不可改变的常数
parameter Real a = 1;
// 方程部分开始
equation
// 定义微分方程:x 的导数(der(x))等于 -a*x
der( x) = - a * x;
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
// 模型定义结束
end HelloWorld;
例:Modelica编写单摆数学模型,包含5个方程
// 定义一个名为Pendulum的类,描述平面单摆系统
model Pendulum "Planar Pendulum"
// 定义常数π,值为3.141592653589793
constant Real PI = 3.141592653589793;
// 定义系统参数:
// m - 摆锤质量(kg),默认值1
// g - 重力加速度(m/s²),默认值9.81
// L - 摆绳长度(m),默认值0.5
parameter Real m = 1, g = 9.81, L = 0.5;
// 定义摆绳张力F(单位:N),是模型计算得到的变量
Real F;
// 定义输出变量:
// x - 摆锤水平位置(m),初始位置0.5(右侧)
// y - 摆锤垂直位置(m),初始位置0(水平位置)
output Real x( start = 0.5 ), y( start = 0 );
// 定义输出变量:
// vx - 水平方向速度(m/s)
// vy - 垂直方向速度(m/s)
output Real vx, vy;
equation
// 质量×水平加速度 = - (x方向分量)×张力F
m * der( vx ) = - ( x / L) * F;
// 质量×垂直加速度 = - (y方向分量)×张力F - 重力
m * der( vy ) = - ( y / L) * F - m * g;
// 水平位置与速度的关系:dx/dt = vx
der( x ) = vx;
// 垂直位置与速度的关系:dy/dt = vy
der( y ) = vy;
// 几何约束方程:摆锤到原点的距离恒为L
// 即x² + y² = L²(圆形约束)
x ^ 2 + y ^ 2 = L ^ 2;
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
end Pendulum;
其中设置仿真起始时间和终止时间,点击setup——》设置“Start Time”和“Stop Time”,当然下面还有设置步长等选项,读者可自行尝试。
例:没有物理含义的DAE系统
model DAEexample
// 定义状态变量 x,初始值(start)设为 0.9
Real x( start = 0.9);
// 定义状态变量 y,无初始值(由代数约束确定)
Real y;
equation
der( y ) + ( 1 + 0.5 * sin( y )) * der( x ) = sin( time );
x - y = exp( -0.9 * x ) * cos( y );
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
end DAEexample;
其中第十行代码表示的公式为:
第十一行代码表示的公式为:
总结以上案例中的语法:
1、是x关于时间的导数,用der(x)表示;
2、start用于表示变量的初始值,如:
Real x (start = 1); //定义变量初始值为1
3、仿真过程中希望该变量的至不变,可用parameter修饰,如
parameter Real a = 1; //固定值设为 1,且仿真过程中不可改变
4、定义实型变量,常用Real修饰,还有其他类型变量,后面会讲到;
5、以e为底数,常用exp()修饰,具体表达为:
格外需要注意:
模型中变量数目和方程数目必须相等,在Dymola软件中check功能中可进行验证,以最后一个例题演示,点击check按钮后,出现一下提示,表示该模型具有相同数量的未知数和方程。
2.1.1变量和预定义类型
1. 模型与类定义
关键词 | 用途 |
---|---|
model | 定义模型(与 class 等价) |
class | 通用类定义(模型、函数等) |
package | 定义包(命名空间) |
block | 定义输入-输出块模型 |
connector | 定义连接器(用于组件连接) |
function | 定义函数 |
record | 定义记录(数据结构) |
type | 定义新类型 |
extends | 继承其他类/模型 |
partial | 声明部分类(抽象基类) |
2. 变量与参数声明
关键词 | 用途 |
---|---|
Real | 声明双精度浮点变量(类似于C语言中double) |
Integer | 声明整型变量(类似C语言中int) |
Boolean | 声明布尔变量(类似C语言中flag) |
String | 声明字符串(类似C语言中char) |
parameter | 声明运行时不可变参数(类似C语言中const double) |
constant | 声明常量(类似C语言中define) |
input | 声明输入变量(C语言中函数参数) |
output | 声明输出变量(C语言中指针输出) |
discrete | 声明离散变量 |
flow | 声明流变量(用于连接器) |
3. 控制结构与算法
关键词 | 用途 |
---|---|
equation | 引入方程段 |
algorithm | 引入算法段(类似C的函数体) |
initial equation | 初始方程(初始条件) |
initial algorithm | 初始算法 |
der | 微分运算符(如 der(x) ) |
when | 条件事件触发(离散事件) |
if | 条件语句 |
for | 循环语句 |
while | 循环语句(较少用) |
4. 连接与组件
关键词 | 用途 |
---|---|
connect | 连接组件端口 |
inner | 声明内部组件(全局变量) |
outer | 引用外部组件 |
5. 控制与注解
关键词 | 用途 |
---|---|
annotation | 添加元数据(图形、文档等) |
import | 导入其他包或类 |
protected | 声明保护成员(仅内部访问) |
public | 声明公共成员(默认) |
replaceable | 声明可替换组件(用于重定义) |
redeclare | 重新定义继承的组件 |
constrainedby | 约束替换类型 |
6. 运算符与特殊符号
关键词/符号 | 用途 |
---|---|
= | 方程赋值(非过程式) |
:= | 算法赋值(过程式) |
+ , - , * , / | 算术运算符 |
^ | 幂运算 |
and , or , not | 逻辑运算符 |
== , <> , > , < | 关系运算符 |
7. 其他重要关键词
关键词 | 用途 |
---|---|
end | 结束类/模型定义 |
enumeration | 定义枚举类型 |
external | 调用外部函数(C/Fortran等) |
time | 内置时间变量 |
注:
1、方程部分由关键词equation开始。
2、constant
= 类似C的 #define
(严格常量),parameter
= 类似C的 const
变量 + 可配置功能,注意区分。
3、Modelica中标识符有两种定义形式:一种是以字母开头,后面跟字母和数字,如x2;另一种时以单引号开始,中间接任何字符,再以单引号终止,如'lifen*521'