Ligral

声明常量

仿真过程中通常会用到许多全局常量。如果您是 Simulink 用户,您可能用 MATLAB 定义过许多常量,然后在 Simulink 中通过 Constant 模块来调用。全局常量的引入使得模型更加健壮和一致,更方便调整参数,因此是很有必要的。

声明一个标量

声明语句很简单,它总是以 let 关键字起头,然后是常量名、等于号和常量值,并且别忘了要用分号结尾。如下所示:

let a = 1;

这个语句声明了一个值为 1 的常量 a 。如果您熟悉 JavaScript 的语法,您会发现语法上是非常相似的。但是在 ligral 中您仅能声明一个常量,不可以再对它赋值。

let a = 1;
a = 2;
~~~~~~~~~~~~
Invalid Syntax at line 2 column 4 (=)

如果您使用的是 v0.1.0 这一版本,您需要替换关键字 let digit ,并且把等于号改成 <- 符号。这是因为该版本仅支持标量。这些符号在 v0.2.* 版本中也会得到支持,但是预计在 v0.3.0 以上版本中废弃。

声明一个矩阵

在 ligral 中,从版本 v0.2.0 开始,数值类型有标量和二维矩阵两种(目前标量和 1 × 1 1\times 1 的矩阵不同,未来可能会统一,但是不影响本节内容),没有向量这一类型,因为向量被当作其中一个维度长度为 1 的矩阵。

在声明矩阵时,应将矩阵的内容包含在一对方括号中,用 ; 符号分割每一行,用 , 符号分割每一行中的每一项。例如:

let A = [1, 0; 0, 1];

矩阵中的项可以是数字,也可以是矩阵,但是要注意维度的一致性。例如在控制系统中,您可能经常需要扩张 A 矩阵,您可以这么写:

let A0 = [1, 1; 0, 1];
let A = [A0, [0; 1]; 0, -1, 0];
A -> Print;
~~~~~~~~~~~~~~~~~~~~~~~~~~
Time: 0.00       Print1 = (3x3)  1 1 0 0 1 1 0 -1 0

上面第四行是一个连接语句,目的是把矩阵打印出来,具体见链接语句文档。

如果您是 MATLAB 用户,您可能对这个语法非常熟悉,但是有一点要注意的是,MATLAB 允许用空格分割行内的项,在 ligral 中是不允许的,因为这常常引起歧义。您可以试试在 MATLAB 中分别运行以下语句,就能明白用空格来分割是多么不明智的选择:

[1 -1], [1 - 1], [1-1], [1- 1]
[1 *1], [1 * 1], [1*1], [1* 1]
~~~~~~~~~~~~~~~~~~~~~~~~
[1 -1] 0 0 0
1 1 1 1

除了您会产生误解之外,这种做法对语法解析也会带来负担,因此我们抛弃了这种写法。

从表达式声明常量

除了直接给常量赋值意外,您还可以进行一些简单的表达式计算。目前支持的操作符有 + - * / ^ ,其中 ^ 和 MATLAB 一致,表示次方运算。

运算的优先级为先计算次方,再运算乘和除,最后运算加减,运算的方向为左结合。如果有圆括号,优先计算括号内部的表达式。

let a = 1 + 2 * 3 ^ (4 - 3);  # 7

在矩阵的声明中也可以使用表达式,表达式既可以出现在每一项中,也可以是矩阵的运算( 目前矩阵的次方虽然语法上支持,但是功能上还没有完全实现 )。

let A = [1+1; 0] + [1; -1];  # [3, -1]

如果要声明一个变量 ...

如果您想要的是随着仿真时长改变的量(或者如果您熟悉 Similink 的话,你想要一个 TimeSeries),请参考模块 Playback 的文档。