一、Matlab被禁,美帝制裁出新招
二、Matlab是什么?它重要吗?
三、那些可以替代Matlab的软件
四、认清当前局势,坚定决心破局
2020年6月初,传出哈工大与哈工程被禁止使用美国MathWorks公司的科学计算工具软件Matlab。对于这个事件,有人认为美国对中国科技力量正在断粮,对中国科技发展将造成重大阻碍。有人对我国工业软件的现状痛心疾首,呼吁加大投入扭转局面。有人认为国内现有科研教育体制限制了创新的产生,导致我们产生不了有影响力的工业软件……对这个事件我们该如何看待?我们如何应对中美在高科技领域较量的新局面?我们如何才能真正摆脱在工业软件落后挨打的被动地位?经过整理与思考后我写了这个文章,共分为三篇:上篇是局与破局,分析在Matlab被禁后当前所处的局势,并提供快速破局的思路与办法。中篇是势与顺势,分析世界开源软件发展的潮流与大势,以及我国如何顺应大势并借势发展自己。下篇是道与法道,分析美国工业软件优势地位是从何而来,什么是其创新与发展之道,以及我们应该怎样学习、吸收并超越。
一、Matlab被禁,美帝制裁出新招
6月6日,荣登美国政府“实体清单”的哈尔滨工业大学与哈尔滨工程大学学生在使用正版Matlab软件时,突然弹出了反激活通知,点击之后当天还能使用,仅仅一天之后,再次启动MATLAB就已显示授权许可无效。
联系软件开发方MathWorks公司,对方表示这就是因为美国政府制裁导致的,作为一家“守法”的美国公司,他们也很无奈。很明显,美国政府对中国的科技封锁又出新花样。
要知道,这两所大学已经购买了正版软件授权,说不让用就不让用了,所谓的契约精神哪呢?是不是应该先把购买软件的费用退了并赔偿损失诶?对此,MathWorks公司并没有表示。不过,有一点是明确的,如果这两所大学的师生以后使用Matlab软件生成的结果发表论文,将被该公司视为侵权,并将面临被起诉的风险!
这个新闻一出,舆论又兴起一波讨论热潮。有人担心在美国持续出招之下,中国高科技力量是否能够撑住。有人认为Matlab这类工业软件完全掐住了科研机构的命脉,我们没有多少机会摆脱被动局面。还有人认为长期以来, 国内对美国在科技领域的全面领先估计不足,没有认真准备,导致落入陷阱反抗无力……对此,我的态度还是要冷静,遇到烦事不要慌,先掏出手机发个朋友圈……不是,先分析当前我们所处的局面是什么?再找到破局的办法。
二、Matlab是什么?它重要吗?
Matlab是一种科学计算语言和交互式集成开发环境(IDE)软件,由Matlab和Simulink两大部分组成。具有科学计算、数学绘图、系统仿真、数据分析、算法开发等强大功能。自1984年由美国Mathworks公司推向市场以来,历经三十几年的竞争和发展,现已成为国际上应用最广泛的科技工具软件,在学术研究与工业设计等领域占有近乎垄断的市场地位。在国内外大学的理工类专业,Matlab已经成为师生必须掌握的一项基本技能。目前世界上有180 多个国家的超过三百万工程师和科学家在使用 Matlab。
上面这段描述对于已经领略Matlab魅力的人来说心领神会,但是对于没有接触过的人而言则有点不知所谓。如果对这个软件都不了解,却空谈如何应对,这就有点搞笑了。所以我先拣几个基础的功能说明一下,让大家尽快熟悉情况。
1. 科学计算
科学计算相信大家都熟悉,Windows自带的计算器就有科学模式,但那对于学术研究与工业设计来说太小儿科了。如果要解一个线性方程组
或者求一个不定积分
你是不是会突然感觉菊花一紧呢?但使用Matlab计算却是So easy。对第一个求解线性方程组,在Matlab中只要输入三行代码:
A=[2,3,-1;8,2,3;45,3,9];
B=[2;4;23];
C=inv(A)*B
马上就可以得出结果:
C =
0.5531
0.2051
-0.2784
这里的三行数分别是x、y、z的值。如果大家线性代数没有忘光的话,可以看出这是用矩阵来求解线性方程组,并且是使用逆矩阵法。在Matlab中使用inv函数就可以获得逆矩阵。
矩阵计算是Matlab的灵魂,其设计哲学就是:“万物皆矩阵”。Matlab这个名称就是Matrix Laboratory(矩阵实验室)的简化。在Matlab中所有参与运算的数据都是矩阵。因为矩阵的理论和方法是现代科学计算的重要基础,诸如数值分析、优化理论、微分方程、概率统计、控制论、力学、电子学、网络等学科领域都与矩阵理论有着密切的联系,甚至在经济管理、金融、保险、社会科学等领域,矩阵理论和方法也有着十分重要的应用。大家还记得有个科幻电影《黑客帝国》英文原名就叫“The Matrix”,也就是矩阵。影片描述了未来人类被超级计算机“矩阵”支配的世界。从矩阵计算的重要性而言,这部电影其实也不算言过其实。而Matlab将大量对矩阵的操作封装成函数,使矩阵的运算极大简化,这是Matlab被广泛使用的最根本的原因。
电影《黑客帝国》海报
前面这个例子是进行科学计算中的数值计算,是求出数学问题的数值精确解或近似解。科学计算还有一种是符号计算,又称计算机代数,就是用计算机推导数学公式,如对表达式进行因式分解、化简、微分、积分、解代数方程、求解常微分方程等。Matlab在符号计算领域也占有着重要地位,虽然是购买的符号计算语言Maple的专利,但也是很厉害了。像上面举例的求不定积分就是一种符号计算。在Matlab中求不定积分也只需要三行代码:
syms x t;
f=5*x*t/(1+x^2);
int(f,t)
结果是
ans =
(5*t^2*x)/(2*(x^2 + 1))
其中第一行用syms语句定义了2个符号变量,第二行定义了需要求积分的函数,最后一行使用int函数即可求出不定积分。
2. 数学绘图
当我们使用Excel等办公软件时就有绘图功能,表现形式还非常丰富。但是它们的绘图是基于给定的数据来绘制,这叫做数据可视化。而Matlab的强大之处是只需要给定一个数学函数就可以进行二维图或三维图的绘制,这对于科研与工业设计提供了极大的便利。比如说,使用下面三条语句:
x=0:0.1:6;
y=sin(x);
plot(x,y);
这就在x轴0到6的范围内,以0.1的步长绘制出了一个正弦图形。
除了二维函数制图,三维制图也很方便。比如表示机械系统振动衰退情况的函数
x,y代表在时间为 t 时的位置。我们可以获得一系列(x,y)的值,并画出(x,y)的二维图像,但在这样的图上时间的影响就得不到体现。
如果我们改用三维绘图,把 t 的值也画出来,那么给研究者的直观印象就完全不一样了。很简单,四条语句就可以:
t = 0:0.1:10;
x = exp(-0.2*t) .* cos(2*t);
y = exp(-0.2*t) .* sin(2*t);
plot3(x,y,t);
这就在 t 轴0到10的范围内,以0.1的步长绘制出了处于不同时间的物体位置的三维图像。
除了前面的绘图,根据不同的需要,Matlab可以绘制许多更复杂也更直观的图形,如这样的
这样的
还有这样的
通过这些举例,相信你会回忆起以前看到过的很多示例图像可能就是用Matlab来绘制的。
3. 系统仿真
进行大型的系统设计,在投入物力生产之前需要知道系统设计是否合理,所以用计算机进行仿真模拟是一个必须的环节。Matlab的Simulink工具箱具备完善丰富的仿真功能,它提供了一个可用于实现各种动态系统(包括连续系统、离散系统和混合系统)的建模、分析和仿真的集成环境。
Simulink是基于模块来实现其仿真功能。模块可以表示物理组件、小型系统或函数,而输入/输出关系就是区别各模块的特征。简单理解每个模块就是一个数据运算单元,对输入数据进行运算处理后转换成不同的数据进行输出。Simulink根据实际需要预制了大量的模块,它们按功能分属于不同的模块库。例如,要对以常量倍数放大输入的扩音器进行建模,可以使用Math Operations(数学运算)库中的Gain(增益)模块。该模块以进入扩音器的声波作为输入,输出则是放大后的同一声波。
将多个模块进行连接就构成了系统,能够形成完整的功能。比如一个简化的汽车运动过程:当踩下油门踏板时,汽车处于加速行进状态;松开踏板后,汽车怠速并逐渐停下来。要创建这个简单的系统,使用Pulse Generator(脉冲发生器,模拟踩一下松一下踏板的动作)、Gain(增益,模拟踩下踏板时获得的加速度)、Second-Order Integrator(二阶积分器,根据加速度分别计算出汽车行驶距离与即时速度)与Outport(输出端口,选择汽车行驶距离作为结果进行观察)4种模块进行连接即可。
在长度为10的时间内经过系统的仿真,可以查看汽车行驶距离形成的曲线。运行仿真后结果显示为一条斜向上的线条。
这就是一个非常简单的系统仿真过程。根据实际的需要增加或调整模块就可以模拟更复杂的系统。除了丰富的预制模块,Simulink还提供扩展功能,可以根据需要自定义模块,这样Simulink就能适应任何行业的系统仿真需要。
除了前面介绍的三大基础功能,Matlab还可以承担数字图像处理、数字信号处理、管理与调度优化计算等众多任务,几乎可以覆盖所有行业的科学计算需求。
Matlab功能强大、应用广泛,主要是因为:以矩阵运算为基本运算方式,随着矩阵理论与方法在各个产业的广泛运用而成为大受欢迎的运算工具;Matlab语言与平台的开放性使得该软件可以在实践中不断被使用者随时进行改进和扩展,能快速满足最新的使用需求;经过30多年的发展,积累了大量的函数与工具,Matlab现在已经拥有二千多个内部函数、超过一百种工具箱。这些积累基本已经能够满足工作中的任何需要。因此,Matlab被戏称为“除了生孩子,什么都可以干”。
说了这么多,把Matlab形容得强大无比,好像是给这个软件做广告似的,其实不是这样。我们在面对Matlab这种垄断性的软件时,先要冷静地承认它的强大,不然它不会达到如今的市场地位。再要了解它的强大体现在什么地方,力量的来源是什么?还要了解它的发展轨迹,知道它是如何发展起来的,其成功经验是什么。最后,要知道它有哪些缺陷,存在什么机会可以追上并超越它。
通过前面的介绍我们大概了解到Matlab的作用与重要性,知道它确实很强大。但再强大的软件,也是一点点发展起来的。Matlab的前身是由美国新墨西哥大学克里夫·莫勒尔(Cleve Moler)教授为主于1971年开发出的EISPACK(矩阵特征系统软件包)与1975年开发出的LINPACK(线性方程软件包)两个简单的程序。1981年为了方便对这两个程序的调用,莫勒尔又开发了Matlab作为语言的编译器与运行环境,最初包括关键词与函数总共只有71个。
1984年,莫勒尔教授的学生杰克·里特(Jack Little)等人发现了Matlab隐藏的商业价值,组成了团队进行了函数、工具箱和图形化等功能的改造与扩充,推出了第一个商业化的版本。至此才走上了一条漫长的发展过程,最终成为科学计算软件的行业霸主。
但是,Matlab并非没有缺点。一是作为一个通用平台庞杂而难免疏漏。涉及的专业领域过多,内部工具、模块大而全,造成体积臃肿,最新的2020a版本整体大小已经达到20多G。而且品控水平不一,很多库的提示信息莫名其妙又长期得不到更新。Simulink中有些内容加了又删,让用户无所适从。二是作为商业软件闭源且收费高昂。差不多所有重要的算法和框架,都是闭源的,并且是按照工具箱收费,每个基本都是上万人民币,一套常用工具箱组合下来需要几十到上百万。虽然针对学校与学生有优惠,但同样是一笔不小的开支。三是作为一个集成计算平台对开发部署不友好。用Matlab编程形成的文件只能在Matlab环境中运行。如果要部署到其它机器上,需要与Matlab Runtime一起打包,其实就是在目标机器上安装一个小型的Matlab,这样的程序文件大小一般都会上G,而且运行体验较差。这造成Matlab在工业级软件开发上基本无所作为。而类似于Matlab解释性脚本语言的开源语言Python后来居上,借着人工智能的火热,占据了工业级矩阵计算软件的半壁江山。四是作为一个拥有几十年历史的老软件不够与时俱进。随着5G和工业互联网的普及,并行计算与边缘计算越来越多。而大规模并行计算一直是Matlab的短板。因为不能在ARM处理器上运行,Matlab基本放弃了大量使用ARM的移动端与边缘计算设备。其庞大的体积也不利于在工控设备上部署。
Matlab从简单的计算工具发展成巨无霸的集成平台,肉大身沉地占据着行业的垄断地位。但说到底它不过是一个工具软件。许多人使用Matlab是因为它确实能解决许多问题,比较趁手,形成了使用习惯。许多同类软件一直没有机会,就是这种习惯力量影响太大,并不是因为存在真正的技术门槛。本来大家相安无事,贵点就贵点,体积大点就大点,这些都是可以忍受的。但突然有一天,Matlab说不能让你用了,这就有点摆不正自己的位置了吧。
一个工具而已,工具是应需求而产生。如果某个工具不让用了,需求就会消失吗?需求只会刺激别的工具跳出来抢机会。这是因果关系,不可能倒置。有的人认为Matlab被禁,会给中国科技发展造成很大困难。这种看法显然是错的。在我看来,对于这次Matlab事件,我们短期可抵抗,中期可反攻,长期可逆转。
三、那些可以替代Matlab的软件
短期可抵抗是指用其它软件来代替Matlab。除了Matlab,其它著名的科学计算类软件还有Mathematica、Maple、SAS、SPSS和LabView等,但这些软件都是商业软件,而且基本都是美国公司的产品(Maple属于加拿大公司),我们没必要再掉入另一个坑里。好在我们还有别的选择:
1. Scilab
Scilab是由法国国家信息与自动化研究院(INRIA)推出的“开放源码”科学工程计算软件,第一个版本在1994年推出。Scilab 是“Scientific
Laboratory"(科学实验室)的简化。与Matlab类似,Scilab可以很方便地实现各种矩阵运算与图形绘制,能应用于科学计算、数学建模、信号处理、决策优化、线性/非线性控制等各个方面。它还提供可以满足不同工程与科学需要的工具箱,例如Xcos、信号处理工具箱、图与网络工具箱等。就基本的功能而言,Matlab能完成的工作Scilab都可以实现。
同时,由于Scilab的语法与Matlab非常接近,熟悉Matlab编程的人很快就可以掌握Scilab的使用。Scilab还提供语言转换函数自动将用Matlab语言编写的程序翻译为Scilab语言。
Scilab的Xcos工具箱类似Matlab的Simulink,同样可以完成建模与系统仿真等任务,并且界面和使用也很类似。因此,Scilab是具备全面替代Matlab潜质的。
更重要的是,作为开放源码的软件,Scilab的安装程序与源代码都是免费的,可以直接下载。用户不仅可以在Scilab的许可证条件下自由使用该软件,还可以根据自己需要修改源代码,使之更加符合自身需要。
Scilab官网:https://www.scilab.org/
2. Octave
Octave是自由操作系统GNU项目下的开源软件,旨在提供与Matlab语法兼容的科学计算、数值分析与数学绘图工具。
Octave的界面和Matlab很像,因为最初它就是模仿Matlab开始的。在编程语言语法和绘图功能方面,Octave和Matlab极其相似,Octave可以直接运行大部分的Matlab源程序,即m文件。Matlab程序除非涉及到比较特殊的工具箱,经过简单的改写即可在Octave中运行。
许多开源项目是同时支持Matlab和Octave的,比如在国外有限元教学中经常用到的ifiss(Incompressible Flow & Iterative Solver Software,不可压缩流迭代求解软件)工具箱,就同时维护了Matlab和Octave版本。知名人工智能专家吴恩达(Andrew Y. NG)在其广受欢迎的深度学习课程中推荐用Octave替代Matlab。
Octave拥有与Matlab工具箱类似的扩展机制,称为包(Packages),现已有50个社区包与21个外部包。其中有几个扩展包可以提供特定领域的系统仿真功能,但仿真功能较弱。
Octave最初是大约在1988年由美国威斯康星大学麦迪逊分校詹姆斯·罗林斯(James B. Rawlings)和德克萨斯大学约翰·埃克尔特(John G. Ekerdt)为化学反应器设计教学而编写的配套软件。系统性开发是从约翰·伊顿(John W. Eaton)在1992年接手才开始的。第一个alpha测试版是在1993年1月4日发布,1.0稳定版则是在1994年2月17日发布。2017年2月伊顿发表公开信,表示因为获得的资助不足以支持Octave开发,他个人投入不少资金导致经济吃紧,希望能找到一份Octave开发之外的工作。之后Octave停止更新了一年多,后在2018年3月恢复更新。最新一版是2020年1月31日发布。自由软件不易,且行且珍惜。
Octave官网:https://www.gnu.org/software/octave/
3. Python Spyder
Python是一种跨平台的计算机脚本语言,在1991年由荷兰国家数学和计算机科学研究所吉多·范罗苏姆(Guido van Rossum)设计创立。Python最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,被广泛用于网站开发、系统管理以及通用的业务应用程序。Python的可扩展性非常强,一些扩展库的出现已经使得Python非常适合科学计算。Python完全免费,许多开源软件都支持Python。
Spyder是一款轻量级的开源Python集成开发环境(IDE ),和其它的Python IDE相比,它最大的优点就是模仿Matlab的“工作空间”布局,适于进行数据分析。Spyder已经集成了Numpy、SciPy、SymPy、Pandas和Matplotlib等流行的科学扩展库,不用再处理环境依赖关系,方便进行科学计算、数据分析与数学绘图。
NumPy是用于数值计算的基本软件包。它定义了数值数组和矩阵类型以及它们的基本运算。
SciPy是对NumPy的增强,是数值算法和特定领域工具箱的集合,其中包括最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其它科学与工程中常用的计算工具。
SymPy是用于符号数学和计算机代数的扩展库。
Pandas是一种灵活易用的数据分析和处理工具。
Matplotlib是Python最著名的绘图库,它提供了一整套和Matlab类似的绘图函数集合,非常适合编写短小的脚本程序进行快速的绘图。
此外,如果要在Python环境中进行仿真,Github上有一个开源项目Simupy。在项目介绍中提到,Simupy是一个可对互连的动态系统模型进行仿真的框架,并提供工具建立基于模型的系统设计和仿真工作流。Simupy是对标Matlab Simulink的仿真软件,但还处于起步阶段。
Spyder官网:https://www.spyder-ide.org/
4. Julia
Julia是2012年麻省理工和哈佛大学的4名计算机科学家推出的开源动态脚本语言。从2009年开始构想这种新语言,初衷是综合科学计算中使用到的多种语言的优点,以免研究人员在多种语言中来回切换。Julia主要用于数值计算,内建了了大量的数学函数, 对矩阵运算支持良好。作为一门新兴语言,Julia在设计上充分考虑了并行计算和分布式计算的需求,最大发挥现代计算机的能力。
Juno是Julia的集成开发环境。
Julia官网:https://julialang.org/
5. ScicosLab
ScicosLab是由一些曾参与Scilab开发的研究人员,在Scilab BUILD4版本的基础上开发的GTK+版本,集成了建模/模拟工具Scicos及众多工具箱,曾被称为是“惟一一款可以与商业软件Matlab/Simulink媲美的开源软件”。
但目前Scicoslab与Scicos都处于停止更新状态。
Scicoslab官网:http://www.scicoslab.org/
除了以上开源软件之外,据说国内已经在开发替代Matlab的产品,但相关信息不多,让我们保持关注。
实事求是地讲,上述开源免费软件与Matlab还存在比较大的差距。无论是在功能完备性(尤其是系统仿真方面),还是在易用性和运用效率上都有很大发展空间,在实际使用中需要几种软件结合才能对Matlab进行替代。作为开源软件依靠技术爱好者自发维护也和商业软件的支持力度不能相提并论。
但是,这些开源软件科学计算能力与开放性、可扩展性都不差,而且在适应新的计算需求上甚至还占有优势,只不过是缺乏大量用户使用反馈的积累与专业团队耐心投入的反复调优,用起来没有那么得心应手。其实Matlab也是从简单的工具成长起来的,在有参照可验证的前提下,工具调整优化所需的时间其实是可以大大缩短的。更重要的是,当前的局势已经让我们没有再挑三拣四的时间了,需要下定决心尽早尽快将开源软件用起来,这才是我们破局的正确出路。
四、认清当前局势,坚定决心破局
长期以来,国内科研界养成了一种“吃现成”的心态,安心地在美国提供的科技基础上进行应用层面的发展。这种思维有其历史原因,现在复盘也不能过于求全责备。但是当禁用Matlab事件出现时,很多人如梦初醒:还能这么做?这真做得出来?我们总不能还无动于衷吧。
面对当前的局势,有两条路可选:一是继续在美国技术基础上赖着不走,甚至是不让用正版就用盗版,能混一天是一天。如果是这种想法,那就太没出息了!
二是果断放弃美国路线,换在新的技术基础上积累与发展。就国内的技术现实而言,完全搞国产的新技术一没积累、二没时间、三没必要。天下苦美久矣,世界人民并不希望一个霸主的下台换来的是另一个霸主上台。如果中国再搞一个封闭的平台,是得不到广泛支持的,也是主动与世界隔离,这正是落入了美国的圈套。正确答案其实就是前面的高频词:开源软件。快速破局的关键就是在短时间内先把开源软件用起来,再用中国的市场需求促进开源软件快速成长成熟,成为我们新的技术基础。
如果要走第二路,先要分析清楚当前的有利条件与将要面对的困难。中国科技行业与开源软件结合,有三大有利条件:
一是中国市场足够支撑开源软件发展。Matlab所属公司MathWorks去年的营收是10亿美元,因为MathWorks未上市,不能查证其在中国市场的收入,但应该数额不小。这些资金既然不让花了,可以拿出一部分来支持开源软件的发展。只要设计一个好的机制,国内市场需求供几个科研软件的开发主体成长壮大问题不大。
二是Matlab并无太强技术壁垒。我曾经在《迎接即将到来的“脱钩”,国产软件的战略准备:数据库篇》中提出一个观点,那就是一款成功的软件产品的同类替代是非常困难的,因为其生态已经深入人心,要改变用户习惯几乎没有可能。所以可能的机会是升级换代,抓住技术革命的机会来发展新的产品。本来在计算工具软件领域,升级换代的机会很小,虽然有并行计算、边缘计算等新的需求,但一般用户其实是无感的。最多能培育几个特定领域的工具出来。但是千算万算谁也没有想到,美国公司会禁止中国人使用。Matlab其实是一个非常合适的对手,它的功能开源软件多多少少都能实现,差距就在好不好用,这通过积累与投入是可以解决的。原来因为生态问题,大家都不抱什么希望的事,竟然会出现美国人自己把市场让出来,奇迹来都来了就不要客气,抓紧时间上吧!
三是现在已经到了中国科研必须重视底层的时间点。国内科研对底层基础研究一直很薄弱,非常依赖各种已有平台和软件工具,不仅是别人嚼过的馍香不香的问题,简直就是天天睡在别人的炕上。中美科技竞争频繁过招,其深刻原因是中国科技力量的崛起已经开始改变世界格局。作为一个新兴力量,该从美国人的炕上下来,把脚踩在坚实的地上了。中国的科研水平、技术力量早就已经具备条件,就差胆识与实际行动了。
我们要面对的困难是,开源软件在国内一直发展缓慢,投入与重视都不够。开源软件本身存在很多问题,其运行机制并不能满足中国市场的需要。这就要在与开源软件结合的过程中大胆创新,用新思路新办法将开源软件与中国具体情况相结合。至于具体怎么做,我在中篇《势与顺势》中再讲。
原文来自:https://mp.weixin.qq.com/s/KxrGnap-vM1uJ9fHYs2mrw
。(转载自)作者:貼發篻的實習生https://www.bilibili.com/read/cv13969498?from=search&spm_id_from=333.337.0.0