一、MMA概述 返回目录页
1、MMA的使用
2、函数
3、表达式
4、数值计算和符号计算
5、数据的表示
6、程序设计
----------------------------------
MMA可以用两个字概括:强大。
用四个字概括:非常强大。
代码短是出名的,MMA的代码n行,其他语言比如C、Java等,要10n行左右。这个有人作过统计。
为啥会这样呢?因为MMA的视角不一样。其他语言在搞零售,MMA在搞批发。
代码短显然是个优点,但带来两个问题:代码比较晦涩、影响运行效率。
MMA的代码,一般来说比较符合人的阅读习惯,个别代码晦涩,可能是用了较多的语法糖。
至于效率,现在的硬件已经很发达,稍低的效率完全可以接受。
---------------------------------
1、MMA的使用
怎么安装破解就不说了,百度上很多。
双击运行。
MMA可以建立多种文件,这里仅关注笔记本文件,即*.nb文件。
启动MMA,会自动创建一个nb文件。右下角可以选择显示的大小。选择一个自己眼睛舒服的大小即可。
代码可以输入进去,或者拷贝进去。文件可以保存。
运行代码有两种方法,Shift+Enter。或者直接按数字小键盘右下解的Enter键。
比如:
1 + 2
运行,得3
1 + 2;
运行,没反应。因为分号的作用是,程序内部运行了,但不输出。
{1 + 2; 1 + 3, 1 + 4}
这里有三个语句。
因为第一个是分号结尾,所以只输出了两句的结果。
最后一个语句,默认为有输出,结尾符号可以没有。
------------------------------------
2、函数
函数由两部分构成,函数名(又叫函数头)与参数。
MMA有数千内置函数(直接拿来可用的)及很多程序包中的函数(必须导入程序包)。
内置函数的函数名,绝大多数用英文全名,可以让人一看到就知道函数的功能。而且函数名的第一个字母,是大写的。
MMA是大小写敏感的语言。即N与n是不同的。
参数个数无限制,中间用逗号隔开。参数包含在[]之中。
比如:
Mod[5, 2]
得1
MMA的内置函数非常多,尽量用内置函数,优化过的,速度快。
当然,自定义函数也很方便:
f[x_] := x + 1; (*就这么愉快地实现了加1功能的函数*)
f[1]
得2
(* 中间是备注内容 *)
这是MMA中唯一的备注形式。//备注,没有。{}备注,没有。/* */备注,没有。
函数名并不一定要放在前面,也可以放在后面。这里给出第一个语法糖:
2 // f
得3
MMA的帮助文件中,以两种形式呈现:
函数浏览器:以讲函数为主。
虚拟全书:以讲功能为主。
函数可以嵌套使用:
2 // f // f
得4
这与写成:f[f[2]],是一样的。
------------------------------------------
3、表达式
每个MMA的表达式,都具有一个Head(函数头)。
Head[a + b]
得Plus
一般我们的习惯是,形式如:a+b的,称之为表达式。形式如:Plus[a+b]的,称之为函数。
殊不知,在MMA中,a+b的内部形式,正是Plus[a+b]。
表面上的很多数学符号的连接体,内部均为函数形式。
按照一般的定义,任何语句都可以称为表达式。而函数不能这样说。
表达式包括函数与atom。atom是最基本的数据类型,后面会说。
在MMA中,任何事物都具有表达式这一共同结构。
可以用FullForm函数把表达式的内部表示显示出来:
3*(a+5)//FullForm
得:Times[3,Plus[5,a]]
很容易看清楚,是把5与a加起来,然后乘以3。这是个嵌套函数。
有时候,嵌套非常多时,满眼都是[],就不太容易看清楚了。这时候,可以这样:
Times[3,Plus[5,a]] // TreeForm
得到一个树形图。
就很容易看清楚了。
a + b // FullForm
a - b // FullForm
a*b // FullForm
a/b // FullForm
观察结果,我们可以看到,在MMA内部,加减都通过加法做,乘除都通过乘法做。
乘号要注意一下,在MMA中,空格可以表示乘号:
a b
即为a*b
2 b
可以写成:2b,中间空格是可以省略的。但不能写成b2,这样的话,b2就会被当成一个符号。
ab中间的空格也不能省,省掉的话一样会被看成符号ab。
2 2
表示2*2,乘号会自动补上。
()的优先级很高。乘除的优先级高于加减。这些优先级一般都不用多说,因为多数符合一般的习惯。
当搞不清楚时,那就宁可加上()。一点不浪费,反而使代码阅读性提高了。
关系算子与逻辑算子的表面形式与内部函数形式,就上图吧:
----------------------------------------------
4、数值计算和符号计算
MMA的数值计算,有两个特点:精确的结果、任意精确度。
1/2 + 1
得3/2
能用分数表达的,就不会输出小数。
Sqrt[2]
得根号2。能用根号表示的,不会输出小数。
那想要小数咋办?用N函数:
Sqrt[2] // N
得:1.41421
一般输出的是六位有效数字。这并不意味着MMA内部在偷懒,其实内部已经算了很多了。
可以指定输出多位:
N[Sqrt[2], 100]
又比如:
N[Pi, 100]
MMA可以有任意精确度的意思是说,只要你的电脑内存够大,有足够的时间等待输出,那么可以输出任意位。
N[Pi, 1000000]
可以试一下。
Timing[FactorInteger[10000!];]
Timing函数可以用来计时。只计计算的时间,输出的时间不算的。分号是表示不输出运算结果。
质因数分解一般认为很化时间的。但这里似乎没有化时间。。自己去观察结果。
Log[E]
得1
这是自然对数。Pi、E等,是内置的数学常数,不要理解为没有参数的函数。
Log[2,8]
得3
任意数作底数,都可以。
符号计算相当好玩了,不给出具体数字,也一样可以解出方程。
Solve[a x^2 + b x + c == 0, x]
注意,a和b之后,都有个空格。
那解方程组咋办?
这样写就可以了:
Solve[a x + y == 7 && b x - y == 1, {x, y}]
Solve[Cos[x] == x, x]
MMA对这个方程,无能为力。嘿嘿,你也有解决不了的时候。
当然喽,MMA不是万能的。但是呢,MMA可以用牛顿求根法,来得到一个近似值:
FindRoot[Cos[x] == x, {x, 1.0}]
初始猜测为1.0。
得:{x -> 0.739085}
不定积分,可以这样:
Integrate[1/(1 - x^3), x]
求导函数,用D:
D[%, x]
%表示上一个输出结果。
化简:
Simplify[%]
积分微分是互逆的,这里可以看到结果回到了原来。
可以计算定积分:
Integrate[Sin[x], {x, 0, Pi}]
可以计算二重积分:
Integrate[Sqrt[x^2 + y^2], {x, 0, 1}, {y, 0, x}]
可以解微分方程:
DSolve[y''[x] == a y[x], y[x], x]
可以解常微分方程组:
NDSolve[{x'[t] == -y[t] - x[t]^2, y'[t] == 2 x[t] - y[t]^3,
x[0] == y[0] == 1}, {x, y}, {t, 20}]
有人说,玩上MMA,学高数的人,笔算能力没有了。
并不都是如此吧?MMA不光能够快速得到结果,还能提高学习者的理解能力。
-------------------------------------------------
5、数据的表示
MMA的三个基本构造块,即三个atom是:
符号 symbol
数字 number
串 string
符号如:a、List、Plus
数字如:1、3.12、3+4I、5/7,分别是整数、实数、复数、分数
串如:"Hello, Hi"
atom没有组成部分,即基本数据类型。
这里要注意的是,串指字符串,不再是字符数组(如C、Pascal语言中)。
至于常用数据,在MMA中,是经常用表(list)来表示的,用{}括起来。
{1, 2, 3}
就是一个表。
MMA中,表的强劲之处在于,表中元素不必同一类型,而且,可以是任意类型。
就是说,啥都可以放在表中。一般的数啊、函数啊、表达式啊,图形啊,可以一起放到表中。
当然,你可以放入一杯咖啡试一下 :)
数据的可视化,在所有的学科中,都是极为重要的。
我们学习数学时,一直强调数图合一。
MMA的编制人员,化了近乎三分之一的精力,用在实现数据的图形呈现上。
这里只举两个例子:
ListLinePlot[Table[RandomInteger[{1, 10}], {10}]]
先产生十个一到十之间的随机整数,放到表中。然后画出拆线图。
Plot3D[Sin[x + y], {x, -3, 3}, {y, -2, 2}]
当变量有两个时,输出函数的立体图。
--------------------------------------------
6、程序设计
MMA据说是世界上最复杂的软件系统。支持这个又支持那个。。
最近看了MMA老板的一个视频,大有一统天下的架势。
MMA不光支持传统的过程式编程,也支持函数式编程。
不光如此,还有独特的模式匹配与变换规则等等功能。
不少会用MMA的,就会忍不住与其他软件比,比如MatLab、比如Python。。
当然,就是死劲黑人家了。。黑了人家,还说我不是故意的。。
听起来很方的样子,其实学会了就容易了。。到时候,你会加入黑人家的队伍么?
这种可能性很大。。很大。。很大。。
MMA允许程序设计者编写“自然码”的能力。
这种自然码更多依赖于你要处理的问题本身的情况,而较少依赖于你所使用的语言风格和独特性。
相当于说,MMA代码,有一种平易近人的味道。
让我们一起来品尝吧。
23:14 2016-10-24
+++++++++++++++++++++++++++++++++++++
扩展阅读:我为什么喜欢Mathematica!(有链接,可以点开)