Mathematica worksheet 1
Intro
其他数学软件: MATLAB, Mathematica, Maple.
MATLAB, namely, Matrix Laboratory 矩阵实验室, 数值计算, 主要关注矩阵上的运算, 仿真. 在工程上运用广泛, 例如偏微分方程求解
Mathematica, 符号计算, 语言灵活, 非常适合数学系 (!)
Maple, 符号计算, 在早年时版本之间没有兼容性 (?), 有很多工具包
Resource
主要参考视频: https://www.bilibili.com/video/BV1av411N7Xi/
主要参考书: Mathematica Programming: An Advanced Introduction -- Leonid Shifrin, 部分中文翻译
j-star.org 笔者翻译了 worksheet1, 可以作为参考
Project Euler: 数学编程练习题网站, 部分解答
这是一个什么样的教程
本教程主要关注 Mathematica 核心语言, 要求有基本微积分和线性代数的知识以及一定的基本编程知识. 使用 Mathematica 这一工具的主要目的是提高工作效率, 效率的定义对不同专业的人是不同的, 对数学工作者来说, 最有效率的程序是 “开发时间” + “运行时间” 最小的程序, 数学工作者不必追求完美, 把运行时间缩到很短, 在跑程序的时候大可去煮一杯咖啡. 那么什么是 “数学工作者 (Mathematician)” ?
“数学家”在中文语义中通常指的是有卓越数学成就的人, 一般的数学工作者在英文中也称为 Mathematician. 在数学家圈子内部, 人们也认为 Mathematician 分成两个有代表性的群体:
用阳光和雨露吃核桃的人 v.s 用锤子和凿子吃核桃的人 -- A. Grothendieck, Récoltes et Semailles (收获与播种)
理论建设者 vs. 问题求解者 -- W.T. Gowers, The Two Cultures of Mathematician (2000)
我们把前一类称为 “数学家”, 后一类称为 “数学工作者”.
数学家的工作方式: 思考, 再思考, 画交换图表 (如果需要), 问题解决; 数学工作者的工作方式则是在选题后解决问题. 数学家一般不需要大量计算, 而数学工作者需要.
机器不能解决一切数学问题, 关键步骤由人来解决, 将机器的工作交给机器, 人的工作交给人是一种高效合理的工作方法.
关键问题在于怎么样将计算方法教给计算机, 参考 Curry-Howard correspondence.
充分理解我们所做的计算, 把它归结为 “重写规则” (尤其在 Mathematica 中)
将 “重写规则” 教给计算机, 使它帮助我们完成计算
基本操作
作为数学计算器的 Mathematica
简单的输入到输出: Shift + Enter 来输出:
NOTE: 如果你进行了一个比较奇怪的运算, 可以使用快捷键 Alt + . 来结束计算.
特殊数学符号例如: E, Pi, I, EulerGamma:
Mathematica 有高精度的数值计算, 注意 MATLAB 是数值计算软件, 但不关注高精度, 因为在工程上不会关注太高的位数:
初等代数运算
微积分运算
NOTE: Ctrl+ / 可以显示出分数线, 同理 Ctrl+ ^ 可以显示幂, 也可以在工具栏->面板->数学助手中查询
NOTE: 其中 -> 表示一个替换规则, 我们会在之后的核心语言中重点提到
NOTE: F1 来调出说明文档
其他有趣的功能
画图:
NOTE: 可以通过 PlotPoints 属性来增加图像平滑程度
NOTE: Mathematica 由两部分组成 -- 前端与内核 (kernel), 你可以在工具栏中选择计算->退出内核, 来把之前的计算结果清空, 清理一些变量, 再给变量赋值之后, 变量名会由蓝色变为黑色.
NOTE: Mathematica 的注释为 (* *)
导入网站图片
类似 PhotoShop 增加图像效果
人脸识别
Mathematica 内置很多高级功能, 就像计算器一般, 只要你将参数正确输入, 就能实现在其他语言中很难实现的功能, 因此很适合快速功能的开发, 尽管效率可能不是很高
Mathematica 内部函数可以从互联网实时抓取数据
值, 变量, 类型
上述简单的用法都不是 Mathematica 最核心的用法, 下面开始介绍核心语言.
我们先从和其他语言相似的部分讲起, 以下三种对象称为原子 (atom):
符号 (Symbol): 由字母和数字 (数字不能在起始位置) 构成的有限序列
数字 (Number): 整数, 有理数, 实数, 复数, (四元数)
字符串 (String): 由双引号 “” 括起来的任意字符构成的有限序列
符号可以认为是其他语言中的变量, 数字和字符串则是变量的值
Mathematica 变量不是类似 C 语言的强类型变量, 是类似 Python 和 R 的可变类型
命名变量时需要避开系统内建符号:
由第一个字母大写的单词组成(Camel命名法):True、False、FactorInteger、SetAttributes
用来做判断的函数末尾通常有“Q”:EvenQ、PrimeQ、MatchQ
用人名命名的符号=人名+符号名:EulerGamma、BesselJ、DiracDelta
一种比较好的做法是在命名自定义符号时将首字母取为小写字母 (camel命名法), 也可以直接用中文命名, 但不推荐. 并且注意全角和半角.
类型检查问题:
一个编程语言的类型检查越严格,程序员受到的束缚就越大。Mathematica 程序通常来说都比较短小,靠程序员自觉检查类型基本上就足够了,所以不需要太严格的类型检查机制。一个较弱的类型系统可以让程序员写出更灵活的程序。例如在上面的例子中,我们可以在需要的时候将 Sin[ ] 中的自变量(此时是个字符串)再替换为合法的数值,由此得到数学上有意义的结果
控制流
在 C 或者 Pascal 这种面向过程的结构化程序语言中,条件、循环和子程序是最基本的三种结构。有了这三种结构就可以实现一切算法。但是,在 Mathematica 程序中,条件和循环结构其实用得并不多。这是因为条件结构的功能基本上可以通过核心语言中的模式匹配来完成;而循环结构的功能则可以通过表处理和泛函编程完成。等读者熟悉这些核心语言的概念之后,会发现它们比条件和循环结构更灵活、更强大、并且更快。在本节中,为了让熟悉 C 语言的读者比较快地上手,我们简单地介绍一下 Mathematica 中的这些结构。
简单条件判断
多重条件判断
简单循环
复杂循环
不推荐使用的:Break、Continue、Return、Goto。
函数
函数定义方法一:模式匹配+延迟赋值
函数定义方法二:纯函数(λ-表达式、匿名函数)
NOTE: 建议初学者使用方法二的完整形式,因为比较简单易懂。
例子: 求不大于给定正整数 n 的所有素数的和