谈谈scilab-xcos的使用心得和实例

作者 | 直观解出品 | 汽车电子与软件

#01

前 言

matlab和simulink很强大,是mdb(model based development),模型为基础的开发的主要工具,但是收费较贵且安装和运行所需的资源较大。

笔者最近有点困扰,因为matlab license到期,且企业内续费流程较复杂,需走采购,故而采用scilab/xcos作为matlab/simulink低配版代替。scilab对应matlab,xcos作为模块化建模工具对应simulink。

实践表明在概念研究和中小规模模型上,scilab/xcos可以某种程度上替补matlab/simulink。而笔者本身也更喜欢小巧瑞士军刀一样的工具,比如用C语言写算法程序,笔者有时候倾向于简单小巧而古老的VC6.0,而非庞大的visual studio系列IDE。

#02

二者简要对比

1. 开源与商业

Scilab 是一个开源、免费的数学软件包,用户可以自由地修改和分发其代码。

Matlab 是一款商业软件,功能全面,但价格昂贵,并非自由软件。

2. 功能与模块

Matlab 提供了多个仿真模块,使用方便,在大学中应用广泛。然而,它的体积庞大。matlab安装后需要20GB空间,笔者使用的scilab含xcos安装后仅需要689MB,安装包本身不到200MB。

Scilab 虽然模块较少,但也具备仿真模拟功能,并且由于其开源特性,具有很高的灵活性和可扩展性。

3. 程序结构与语法

两种软件的程序结构和语法非常相似,只有少数名称可能不同,例如:hist 和 hist plot。然而,Scilab不会自动加载函数,目的是节约内存,按需加载,这点对笔记本电脑特别友好;相反,它在加载之前会显式地执行 getf() 命令。

Scilab脚本和函数的运行方法与Matlab有很大不同。Scilab代码可以写入文件,再导入到Scilab中批量执行。

4. 数据类型与操作

两者都具有丰富的数据类型,可以处理矩阵运算与图形显示 。

关于基本运算能力的问题,Matlab和Scilab之间不可能有明显差别,因为它们使用的库大致相同,如线性代数依赖LAPACK。

5. 图形界面与工具箱

Matlab 拥有更多的工具箱,支持更广泛的领域,如信号处理、图像处理等。

Scilab 也有许多有助于完成不同任务的工具箱,虽然在数量和深度上可能不及Matlab,但在一般场景已经绰绰有余。

6. 性能比较

在计算速度方面,Matlab略胜一筹,因为它包含了一些用Fortran和C++编写的DLL,这些可能比Scilab中的实现稍好一些 。但对于大多数实际应用来说,这种性能差异通常是可以忽略不计的。

7. 社区支持与文档

Matlab 拥有一个庞大且活跃的社区,提供了大量教程和支持资源。

Scilab 的社区相对较小,但仍然有足够的文档和技术支持来满足大多数用户的需求。

另外,需要说明,即使使用这类科学计算工具,也需要遵循良好的编程规范。比如在十多年前,有人抱怨scilab程序如果有十几层嵌套会崩溃,而matlab运行正常。笔者没有验证scilab发展十几年后是否还有这种问题,因为有良好编程习惯的工程师不会允许代码嵌套超过五层以上,圈复杂度有要求。

#03

安装和使用

scilab安装十分简单,和装微信差不了多少。

图 1 scilab安装,并且包含xcos建模仿真组件

如果你硬盘空间足够,建议在可选项之间选大一些的包,空间换性能。

比如图中笔者为scilab的cpu优化选择了Intel MKL而不是blas,lapack,因为如下原因:

Intel Math Kernel Library(MKL)、BLAS(基本线性代数子程序)和 LAPACK(线性代数包)从名字就可以看出用途和范围。

Intel MKL是一个综合性的数学库,涵盖了 BLAS、LAPACK 的功能,还包括快速傅里叶变换(FFT)、随机数生成、向量数学运算等其他丰富的数学功能。

BLAS主要提供基本的线性代数运算的子程序,如向量与向量、向量与矩阵、矩阵与矩阵之间的乘法、加法等操作。它是更底层的线性代数运算库,为其他高级线性代数库提供基础支持。

LAPACK是建立在 BLAS 之上,专注于解决更复杂的线性代数问题,如矩阵分解(LU 分解、QR 分解等)、求解线性方程组、计算特征值和特征向量等。

性能上Intel MKL是针对 Intel 处理器进行了高度优化,能够充分利用 Intel 芯片的各种特性,如多核并行、向量指令集(SIMD)等,在 Intel 平台上通常能达到非常高的性能,尤其是对于大规模数据的运算。

应用场景上Intel MKL:适用于各种需要进行大量数学计算的场景,包括科学计算、数据分析、机器学习、深度学习等。在 Intel 架构的计算平台上,能为这些应用提供高效的计算支持,帮助加速模型训练、数据处理等过程。

两份学习文档Scilab for very beginners和Xcos for very beginners足以入门,均可以在https://www.scilab.org/找到。

图 2 scilab的计算和绘图窗口,很类似于matlab

图 3 3d绘图结果,在美观性上确实不如matlab

图 4 xcos的模块浏览器,模块基本够用

#04

应用举例

4.1 车辆运动阻力仿真

现代电动汽车的动力系统仿真包括对以下部分进行模拟:

底盘

传动系统

电机

电池

在底盘部分,模拟车辆的加速度、车辆阻力、阻力功率,并获得车轮扭矩和车轮转速。

进一步的,底盘模型的输出,即车轮扭矩和转速,作为传动系统仿真的输入,以获得传动扭矩和传动转速。利用这些输出,进而获得电机扭矩、电机转速和电机功率。此外,根据这些信息,可以根据需求确定哪种电机最适合该车辆。最后,根据所得数值编制电压和电流曲线,并设计合适的电池。

这里对底盘中的车辆阻力进行建模。

空气动力:通常被称为气动阻力,是车辆因空气而受到的阻力。有些OEM有风洞就是这个原因,特别是赛车厂商。

坡度力:由道路的坡度或倾斜度产生的车辆重力分力。

滚动阻力:在轮胎与路面的接触点处阻碍车辆向前运动的力。滚动阻力是使车辆在滑行时停止的力。

加速力:牛顿第二定律,帮助车辆在一定时间内达到预定速度的力。

遵循的算式如下:

Fa =0.5×ρ×A×Cd ×V2

Fg =GVW×sin(θ)

Fr =GVW×Crf

F=ma

车轮扭矩 = 总阻力 × 车轮半径

车轮速度 = (车速 / (2 × π / 60)) × 车轮半径

F=ma不用解释,其余公式的解释如下:

1、空气阻力公式:Fa = 0.5×ρ×A×Cd×V²

Fa:空气阻力(Drag Force),单位为牛顿(N)。

ρ:流体密度(Density of the fluid),对于空气通常约为1.225 kg/m³,在标准大气条件下。

A:参考面积(Reference Area),通常是物体的迎风面积,单位为平方米(m²)。

Cd:阻力系数(Drag Coefficient),无单位的量,取决于物体形状及表面特性。

V:相对速度(Velocity),单位为米每秒(m/s),是物体相对于流体的速度。

此公式描述了当一个物体穿过流体时,它所受到的阻力大小如何随着速度平方、物体形状以及流体性质变化。

2、重力分量公式:Fg = GVW × sin(θ)

Fg:重力沿斜面方向的分量(Gravitational Component Force),单位为牛顿(N)。

GVW:总车辆重量(Gross Vehicle Weight),即汽车或物体的总质量乘以重力加速度g,单位为牛顿(N)。

θ:坡度角(Angle of Inclination),单位为弧度(rad) 或度(°)。

这个公式用于计算在倾斜表面上,由于重力作用而产生的平行于斜面的分力[13]。

3、滚动阻力公式:Fr = GVW × Crf

Fr:滚动阻力(Rolling Resistance Force),单位为牛顿(N)。

GVW:总车辆重量(Gross Vehicle Weight),如上所述。

Crf:滚动阻力系数(Coefficient of Rolling Friction),无单位的量,反映轮胎与路面之间的摩擦特性。

滚动阻力是指车辆行驶时轮胎变形及地面接触所产生的阻力。

图 5 车辆运动阻力仿真完整模型,来自github的Vehicle-Resistive-Forces-Model项目

整个仿真是给定每个具体时刻车辆速度kmph千米每小时和坡度grade,计算车辆(质量900kg)的上述四种阻力,进而推算车轮所需的扭矩。至于车轮轮速的推算和受力无关,只是车速的简单换算。

整个仿真是让车辆绕试车场3圈,three tracks,每个track是如下数据结构,车速相当快,应该是某种竞速车辆:

Drive Cycle,

time(s),Velocity (Kmph)

0,289.83

0.1,289.46

0.2,289.71

0.3,290.46

0.4,290.46

0.5,291.2

0.6,291.45

0.7,291.95

0.8,292.45

......

每个track都使用相同的grade坡度数据,格式如下:

Grade Angle Data,

time(s),Grade Angle(theta)

0,0

0.1,0

0.2,0

0.3,0

0.4,0

0.5,0

0.6,0

0.7,0

0.8,0

0.9,0

1,0.5

1.1,0.6

1.2,1

1.3,1.2

......

需要说明的是,真实坡度不会随时间固定,也就是不会在第几秒坡度多少;而是应该坡度随位置固定才对,也就是车跑到某一位置时坡度是多少。笔者所用实际项目中,已经通过积分track的车速来判断车辆实时位置,然后根据实时位置来给出坡度。

每个track实时计算4种阻力,包括加速度所需要的力。而加速度是后一时刻车速减去前一时刻车速得到的。

图 6 车辆受力分析,来自Vehicle-Resistive-Forces-Model项目

仿真结果是输出车辆克服阻力总和并达到所需加速度的车轮扭矩和对应的实时轮速:

图 7 作为仿真结果的实时车轮扭矩和轮速,来自Vehicle-Resistive-Forces-Model项目

其实绝大多数仿真过程,完全可以用c/c++或者Python语言直接计算,而且用编程语言写计算公式比用block组合计算公式还要来的简单。但xcos或者simulink不仅将计算结果可视化,而且把计算过程也可视化了,对于直观理解有帮助,也更便于交流讨论。一般的通用型编程语言对计算结果可以可视化,但对于计算过程不容易可视化。

4.2 PID(比例 - 积分 - 微分)控制系统

图 8 一个简单的PID系统,图片来自示例工程

左侧信号源:一个阶跃信号发生器,用于产生一个突变的输入信号,作为系统期望达到的目标值或参考值。

控制核心及处理部分如下:

求和模块(Σ):将输入的参考信号与反馈信号进行相减运算,得到误差信号。

PID 模块:根据误差信号,通过比例(P)、积分(I)、微分(D)三种控制作用的线性组合,计算出控制量。

传递函数模块:

Kf / (1 + tauf s) 、Kp / (1 + tau1 s) 、1 / (1 + tau2 s) :这些是不同的动态环节,代表系统中的不同物理特性或需要调节的部分,如惯性环节等,用于模拟实际系统的动态响应。

Km / (1 + taum s) :反馈通道中的传递函数,将系统输出反馈到求和模块,用于计算误差。

输出及显示部分

MUX(多路复用器):可能用于将多个信号组合在一起进行后续处理或显示。

右侧显示模块:带有对勾标识的模块,可能是用于显示系统输出结果,比如输出信号的波形等。

具体的,

Kf:是一个增益系数 ,与传递函数 \(\frac{Kf}{1 + tauf s}\) 相关,其中 \(1 + tauf s\) 构成一阶惯性环节。Kf 可用来调整该环节输出信号的幅值,影响系统动态响应特性,比如改变响应速度和超调量 。

Km:出现在反馈通道的传递函数 \(\frac{Km}{1 + taum s}\) 中,同样是增益系数。它决定了反馈信号的强度,对系统稳定性和稳态误差有重要影响 。合适的 Km 取值有助于使系统输出更好地跟踪输入信号 。

Kp:在传递函数 \(\frac{Kp}{1 + tau1 s}\) 里,也是增益系数。和其他环节配合,影响着系统的整体动态行为,比如调节系统对输入信号变化的响应灵敏度等 。 它们都是控制系统中用于调整系统性能的重要参数 。

其中,一阶惯性环节可从物理意义上讲,是描述具有储能和耗能特性的系统,能量的储存和消耗过程使得系统对输入信号的响应存在一定的滞后。其数学表达式为一个一阶线性常微分方程,在复频域(拉普拉斯变换域)中,一阶惯性环节的传递函数为:

\(G(s)=\frac{K}{Ts + 1}\)

对于敏锐的读者,可能会问,这个控制系统中已经有pid block,为什么需要增加其它增益模块才能完成完整的pid控制闭环?

原因是系统自带的pid模块block十分简单,里面只能设置比例 - 积分 - 微分三个系数,不能表示时延、反馈等等系统特性。

图 9 系统自带pid block的内部,只能设置三个系数

这类附加的系统特性,比如响应时延,对于描述和仿真真实的闭环控制系统十分重要。比如刹车系统,踩下刹车到车轮的盘式或者鼓式刹车开始减速车轮是存在一个微小的系统时延的。

#05

总 结

不得不承认,scilab目前在神经网络这一块明显弱于matlab,其ATOMS神经网络模块所包含的神经网络类型相当有限,只有下面几种:

The ATOMS module could be used to build following netwroks

1. Perceptron

2.Adaline

3.Multilayer Feedforware Backpropagation Network - Gradient Decent - Gradient Decent with Adaptive Learning Rate - Gradient Decent with Momentum - Gradient Decent with Adaptive Learning Rate and Momentum - Levenberg–Marquardt

4.Competitive Network

5.Self-Organizing Map

6. LVQ1 Network

但是笔者工作中使用神经网络时,主要是基于Python的pytorch工具,一些简单的神经网络可以用numpy和scipy实现。并不依赖scilab做AI研究,而主要靠matlab或者scilab做系统仿真和优化算法。所以scilab在神经网络这一块偏弱,对实际工作影响并不大。

在matlab使用昂贵,管控严格,并且容易被制裁管控(可参阅《美国终于出手打击中国的基础科研了:详解Matlab被禁的深远影响》https://mp.weixin.qq.com/s/SXXGXcrXpYz_jbfni8ROzw)的今天,有一款小巧够用的轻量级替补队员,无论对个人研究还是职业工作都很有必要。

/ END /

Top