一、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!(有链接,可以点开)

                        Top

一、MMA概述的更多相关文章

  1. Mathematica(MMA)闪电入门系列 目录与说明

    Mathematica(MMA)闪电入门系列  入口 本文起到目录作用,点击以下链接,可以打开各章: 一.MMA概述二.表操作三.函数与递归四.表达式的计算五.过程式编程和调试技巧六.图形七.程序包 ...

  2. 【AR实验室】ARToolKit之概述篇

    0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...

  3. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  4. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  5. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  6. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  7. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  8. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  9. [AlwaysOn Availability Groups]健康模型 Part 1——概述

    健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...

随机推荐

  1. UICollectionView的使用

    感谢下面文章作者的无私奉献 基础用法: http://www.cnblogs.com/ios8/p/iOS-UICollectionView.html http://my.oschina.net/jo ...

  2. Redis 64 steps

    a memo for redis 64 operations start server in console: 1. D:\>cd redis64 2. D:\redis64>redis- ...

  3. nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token

    最近要用到一个叫融云的及时通讯的SDK,在获取token这个步骤的时候有点卡顿,以防以后碰到类似的问题,再此记录一下. 客户端通过融云 SDK 每次连接服务器时,都需要向服务器提供 Token,以便验 ...

  4. storm基础系列之一----storm并发度概念剖析

    前言: 学了几天storm的基础,发现如果有hadoop基础,再理解起概念来,容易的多.不过,涉及到一些独有的东西,如调度,如并发度,还是很麻烦.那么,从这一篇开始,力争清晰的梳理这些知识. 在正式学 ...

  5. asp.net下出现其中的组件“访问被拒绝”的解决方法

    一.一般情况下,对该组件重新授权即可.附上ASP,NETWORK SERVICE用户的可修改权限. 二.其中最常见的原因是Indexing service服务引起的.解决方法就是停用Indexing  ...

  6. 【学】React的学习之旅2 - React Component的生命周期

    分成三个状态: Mounted Update Unmounted Mounted:当我们看到组件在浏览器中从无到有的效果的时候,mounted已经结束了,这个组件已经被mounted了 有这个阶段有2 ...

  7. 使用Group By注意事项

    当查询中存在group by子句时,select列表(或是having子句)中只能存在分组函数,或是出现在group by子句中的字段. 这里说的,"出现在group by子句中的字段&qu ...

  8. Codeforces Round #377 (Div. 2) D. Exams(二分答案)

    D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...

  9. 在linux上通过yum安装JDK

    完全转载自:https://my.oschina.net/andyfeng/blog/601291 这里完整粘贴一份留存 卸载centos自带的jdk 1.查看当前的jdk版本,并卸载 [root@l ...

  10. 同时使用Junit4的@Parameterized参数化测试和Spring容器

    转载:http://www.jianshu.com/p/d191fe54915f 整合Spring容器 @SpringApplicationConfiguration(classes = Applic ...