• 一、MMA概述



    一、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


  • 相关阅读:
    C语言编程 两种方法打印一个菱形(渐入显示)
    Java编程格式输出中 printf 的使用实例
    C语言编程输入一个5位数以内的正整数,完成以下操作
    C语言编程判断两个矩阵是否相等(n阶矩阵)
    C语言编程输出100到200的素数的两种方法,和三步优化(逐步优化)
    Java编程中Math.random()的应用(随机生成数的应用)
    C语言编程求1X2X3····Xn所得的数末尾有多少个零
    C语言大数的阶乘
    maven构建一个简单的springboot项目
    nginx的配置
  • 原文地址:https://www.cnblogs.com/xin-le/p/5992385.html
Copyright © 2020-2023  润新知