在计算机里寻求符号计算是不是搞错了什么?

计算机系的学生,大多都是明白计算机是如何做数值计算的。

比如说,你让一台x86计算机算0xff+0xff00等于多少,可以写成这样的汇编:

mov eax, 0xff ;把0xff这个数放到eax寄存器里
add eax, 0xff00 ;把eax寄存器里的数加上 0xff00

至于小数,可以用浮点数去算,这些东西都能在硬件上实现。事实上,我们也写过一个简单的CPU,大概知道这些东西在电路上是什么样的。

可是,很多计算机系的学生,也不明白计算机是如何进行符号计算的。比如说,我要算以下的微分式:

ddxx2=2x\frac{d}{dx}x^2=2x

这种运算是如何让计算机做的呢?请自行阅读《计算机程序的构造与解释》,这里不再赘述。我们今天的重点是,如何用mathematica来算这些东西。

通向可用的mathematica之路

mathematica是商业软件,学生版要400多元。大家可能不想出这些钱,毕竟美国公司嘛,薅点羊毛也没什么。**(注意:如果要进行商业、学术使用,请使用正版软件,否则后果自负。)**想不花钱用,主要有两个手段:

  • 官方免费版,我用的是这个,即wolframscript或者说wolframEngine
  • 破解版,请参考https://tiebamma.github.io/InstallTutorial/

wolframscript和mathematica有啥区别呢?主要的区别在【用户界面】上。wolframscript就是一个解释器的REPL,和python、scheme的使用方法没有太大区别。而mathematica则是一个GUI软件,是【笔记本】形式的,每一行代码都是【一个块】,可以单独执行。

说到这里,读者应该明白了,wolframscript就是给我们这些程序员用的,mathematica是给非程序员用的。当然也不用划得这么清楚,我的建议是可以都体验一下,然后再决定用哪个。

这里还要提醒一点,wolframscript会出现玄学的下载问题,如果不在linux下工作或者没有科学上网的手段,能不能安装上纯看运气~

mathematica语言

在mathematica里,一切操作都可以通过【函数】来完成。它调用函数的语法也很简单:

Func[arg1, arg2, ..., argn]

比如说,加法可以这样去算:

Plus[1, 2]

1

乘法可以这样去算:

Times[1, 2]

读者也许会惊呼,这不就是伟大的scheme\lisp吗?

(+ 1 2) ;-> 3
(* 1 2) ;-> 2

可惜的是,mathematica里面有一些scheme\lisp从出生就避免了的错误。何出此言呢?我们看看函数是如何定义的吧:

F[para1_, para2_, ... ] := expr

对于这个定义,我马上就可以提出几个疑问:

  • 为啥参数要加_呢?
  • 为啥定义的时候要用:=而不是=呢?