(1)简介
数学系给本科生开设一门课: \"符号计算系统\主要简单讲授 mathematica(以下简称math)软件的使用及其编程,赶兴趣的同学可以找本math书以求更深入的了解.
我们平日用到编程语言时, 大家都知道编程中用到的整型, 实型, 甚至双精度数, 都只是一个近似的数, 其精度有限, 有 效数字有限, 在很多时候达不到实际需要的要求. 符号计算与 数值计算的区别就在于符号计算以准确值记录计算的每一步的 结果, 如果需要时, 可以将精确表示按需要计算成任意位数的 小数表示出来(只要机器内存足够大).
最常见的符号计算系统有maple, mathematica, redues等, 这些软件各有侧重, 比如,maple内存管理及速度比math好, 但 是图形方面不如math; redues没找到, 没用过, 未明; 而用得 较多的matlab编程环境特好, 和C语言接口极其简单, 遗憾的是 它不是符号计算, 只是数值计算. 所以, 就实用而全面来说, math是一个很好用的软件.
math软件不仅能够进行一般的+-*/及科学函数如Sin, Log 等计算, 而且能进行因式分解, 求导, 积分, 幂级数展开, 求 特征值等符号计算, 并且, math有较强的图元作图, 函数作图, 三维作图及动画功能.
(2)mathematica入门
mathematica自发布以来, 目前比较常见的有math 1.2 for DOS, math 2.2 for Windows, math 3.0 for win95, math 3.0 for UNIX.
DOS下的math的好处就是系统小, 对机器要求低, 在386机 器4M内存下就能运行得很好(机器再低点也是可以用的, 比如 说286/2M). 在DOS下直接键入math<回车>即可进入math系统, 出现的提示符In[1]:=, 这时就可以进行计算了, 键入math函 数, 回车即可进行运算. 如果输入的Quit, 则退出math. 这里 要注意的是, math区分大小写的, 一般math的函数均以大写字 母开始的.
windows下的math对机器要求就要高一些了, math3.0更是 庞大, 安装完毕有100M之多(2.2大约十多兆). 同windows下的 其他软件一样, math可以双击图标运行, 在File菜单下有退出 这一项. windows下的math有其优越性, 就是可以在windows下 随心所欲地拷贝粘贴图形. math3.0更是能输入和显示诸如希腊 字母, 积分符号, 指数等数学符号. DOS的math与windows下的 一个区别是DOS的以回车结束一句输入, 而windows的以 +<回车>结束一句输入. DOS下的提示符显示为In[数字]:=, 而 windows下在结束输入后才显
示出In[数字]:=及Out[数字]:=字样. (Out为输出提示符) 下面试试几个例子:(In[数字]:=为提示符, 不用键入)
In[1]:= 2^100 计算2的100次方 In[2]:= s={{3,7,9},{7,4,3},{1,3,8}} 定义矩阵s In[3]:= Eigenvalues[s] 计算s的特征值 In[4]:= Plot[Sin[x],{x,0,Pi}] 在0,Pi间画Sin In[5]:= Plot[Cos[x],{x,0,Pi}] Cos In[6]:= Plot3D[Sin[x]Sin[y],{x,0,1},{y,0,2}] 三维作图
以In[6]为例说明: math的函数都以大写字母开头的单词 为函数名, Plot3D, Plot, Eigenvalues, Sin等, 常数也是如 此, 如Pi. 函数名后的参数用[]括起, 逗号隔开.
math的输出可以作为函数的输入对象, 你可以再试一个: In[7]:=Show[%%,%%%] 这里一个%代表上一个输出, 两个代表 上两个... 也可以直接用Out[n]代表第n个输出.
这里需要补充的是 !command 执行DOS命令
?name 关于name(函数等)的信息(可以使用通配符) ??name 关于name的额外信息
(3)基本计算
1. 算术运算符
+加-减*乘/除^指数 (乘也可用空格)
N[expr]或expr //N 计算expr的数值(6位有效数字) N[expr, n] n表示小数的位数 2. 数学函数
Sqrt[x] x开方 Exp[x] e的x方 Log[x] x的自然对数 Log[b,x] 以b为底, x的对数
Sin[x], Cos[x], Tan[x], ArcSin[x], ArcCos[x] 三角函数 Abs[x] |x|
Round[x] 离x最近的整数
Floor[x] 不超过x的最大整数 Quotient[n,m] n/m的整数部分 Mod[n,m] n/m的余数 Random[] 0,1间随机数 Max[x,y,...] Min[x,y,...] 最大数和最小数 3. 常数
Pi Pi=3.141592653589793... E e=2.71828... Degree Pi/180 I i=Sqrt[-1] Infinity 无穷大
Catalan Catalan常数.=0.915966 ComplexInfinity 复无穷 DirectedInfinity 有向的无穷
EulerGamma 欧拉常数gamma=0.5772216 GoldenRatio 黄金分割(Sqrt[5]-1)/2 Indeterminate 不定值 4. 逻辑运算符
==, !=, >, >=, <, <=, !, &&, || Xor 异或 Implies 隐含
If[条件,式1,式2] 如果条件成立, 值式1; 否则得式2 5. 变量
a) 变量名以字母(一般小写)开头; 字母数字组成. (如x2为变量名; 而2x, 2*x, 2 x, x*2, x 2均是x乘以2). b) 赋值
x=value; x=y=value; x=.(清除x值) c) 代换
expr /. x->value 将式中x代换为value expr /. {x->xval, y->yval}
下面就让我们以几个例子来结束本节:(大家还是注意, DOS下的Math, 只要 输入In[num]:=后的指令后按回车, 而windows下则是按+回车.) 大 家看看都有什么输出.
In[1]:= 2.7+5.23 In[2]:= 1/3+2/7 In[3]:= 1/3+2/7 //N In[4]:= N[Pi,100]
曾经有人问我, 你是怎么算出Pi的1000位而 没有错误的, 其实很简单, 大家只要
把上式的100改为1000即可.
In[5]:= Sin[Pi/2]+Exp[2]+Round[1.2] In[6]:= 10<7
In[7]:= x=5;
如果在输入之后加上一个\";\则只运算不输出. IN[8]:= y=0
(所以In[7]和8完全可以合成一条x=5;y=0, 假如 我不需要x=5的输出) In[9]:= x>y In[10]:= t=1+m^2 In[11]:= t /. m->2 In[12]:= t /. m->5a In[13]:= t /. m->Pi //N
(4)代数变换
上一节我们已经学习了Math里的基本运算及逻辑运算, 常用数学函数, 几 个常见的常数, 以及变量的使用. 这一节, 我们来学学基本代数变换: Apart, Cancel, Coefficient, Collect, Denominator, Expand, ExpandAll, Exponent, Factor, Numerator, Short, Simplify, Together.
Expand[expr] 多项式expr按项展开 Factor[expr] 因子形式 Simplify[expr] 最简形式 In[1]:= Expand[(1+x)^2] In[2]:= Factor[%]
我们以前说过的哦, %是上一个输出, %%是上上个, %%%是上上上个, ..., %n是第
n个输出(即Out[n]) In[3]:= Simplify[%%]
In[4]:= Integrate[x^2/(x^4-1),x] 这是积分运算, 详情后叙 In[5]:= D[%,x] 求导 In[6]:= Simplify[%]
ExpandAll[expr] 所有项均展开 Together[expr] 通分
Apart[expr] 分离成具有最简分母的各项 Cancel[expr] 约去分子,分母的公因子 Collect[expr] 合并 In[1]:= e=(x-1)^2 (2+x)/((1+x)(x-3)^2) In[2]:= Expand[e] In[3]:= ExpandAll[e] In[4]:= Together[e] In[5]:= Apart[%] In[6]:= Factor[%]
Coefficient[expr, form] 表达式中form项的系数 Exponent[expr, form] form的最高幂次 Numerator[expr] 取分子 Denominator[expr] 取分母
expr //Short 以简短形式输出 In[1]:= e=Expand[(1+3x+4y^2)^2] In[2]:= Coefficient[e, x] In[3]:= Exponent[e, y] In[4]:= q=(1+x)/(2(2-y)) In[5]:= Denominator[%] In[6]:= Expand[(x+5y+10)^4]
In[7]:= %//Short 把上式输出, 中间项省去, 以<<数字>>表示 省去的项数.
最后, 我们以例子来看看用符号名做客体的标志的好处
In[1]:= 12meters In[2]:= %+5.3meters In[3]:= %/(25seconds)
In[4]:= %/.meters->3.78084feet 一下子就把米制变为英尺了.
(5)微积分运算(2-1)
学到上一节, 大家会发现怎么还停留在中学的计算中呢, 这一节, 大家就会看到微分D, Dt; 积分Integrate, NIntegrage; 和与积Sum, Product, NSum, NProduct. 下一节我们 介绍解方程Solve, Eliminate, Reduce, NRoot, FindRoot, FindMinimum; 幂级数Series, Normal; 极限Limit; 特殊函数Fourier, InverseFourier, ...
微分
D[f, x] f对x求导 D[f, x_1, x_2, ...] f对x_1, x_2, ...求导 D[f, {x, n}] f对x求n次导 Dt[f] 全微分df Dt[f, x] 全微商df/dx In[1]:= D[x^n,x] In[2]:= D[f[x],x] In[3]:= D[2x f[x^2],x] In[4]:= D[x^n, {x, 3}] In[5]:= D[x^2 y^3, x, y] In[6]:= Dt[x^n] In[7]:= Dt[x y, x] 积分
Integrate[f,x] f对x积分
Integrate[f, {x, xmin, xmax}, {y, ymin, ymax}, ...] 定积分 NIntegrate[f, {x, xmin, xmax}, {y, ymin, ymax}, ...] 计算积分的数值解
In[1]:= Integrate[Sin[Sin[x]],x] 嘻嘻, 无法计算, 原样输出 In[2]:= Integrate[Log[x], {x,0,6}] 啊, 广义积分也一样算
In[3]:= Integrate[x^2+y^2, {x,0,1}, {y,0,1}]
In[4]:= In[3]//N 如果你的上一条输入不是In[3], 注意 调整这一条的输入哦 In[5]:= Integrate[Sin[Sin[x]], {x,0,1}] 怎么还没法计算啊 In[6]:= N[%] 或
NIntegrate[Sin[Sin[x]], {x,0,1}] 呵, 终于可以计算了. 和与积
Sum[f, {i, imin, imax}, {j, jmin, jmax}, ...]
f对i, j, ...分别从imin到imax,jmin到jmax,...求和 Sum[f, {i, imin, imax, di}] 求和的步长为di Product[f, {i, imin, imax}, {j, jmin, jmax}, ...] 求积 NSum 数值解 NProduct 数值解 In[1]:= Sum[x^i/i, {i,1,4}] In[2]:= Sum[x^i/i, {i,1,5,2}] In[3]:= Sum[a/i^3, {i,1,10}]
In[4]:= N[%] 或 NSum[a/i^3, {i,1,10}]
In[5]:= Sum[1/i^3, {i,1,Infinity}] 可能原样输出, 也可能输出Zeta[3] (依math的版本不同而异) In[6]:= N[%]
In[7]:= Sum[x^i*y^j, {i,1,3}, {j,1,i}]
注: 如果想要求带符号上下限的Sum, 在math3.0中, 直接使用Sum函数即可: In[8]:= Sum[1/Sin[i], {i,1,n}]
而如果在旧版本的math, 则可能需要调入包(package) \"gospersu.m\调入 格式一般为
In[8]:= <<\"盘符:\\\\math路径\\\\packages\\\\algebra\\\\gospersu.m\" (不同安装目录可能出现不一样) 然后使用函数GosperSum[]
(6)微积分运算(2-2)
上一节, 我们一起学习了微分D, Dt; 积分Integrate, NIntegrage; 和与积Sum, Product, NSum, NProduct. 这一节我们将介绍解方程Solve, Eliminate, Reduce, NRoot, FindRoot, FindMinimum; 幂级数Series, Normal; 极限Limit; 特殊函数Fourier, InverseFourier, ...
最后, 我们说明一下math的函数的定义, 别名的使用, 以及不同输出格式 解方程
Solve[{lhs1==rhs1, lhs2==rhs2,...}, {x,y,...}] 解关于x,y,...的方程组{lhs1==rhs1, lhs2==rhs2,...} Eliminate[{lhs1==rhs1, lhs2==rhs2,...}, {x,y,...}] 在联立方程中消去x,y,...
Reduce[{lhs1==rhs1, lhs2==rhs2,...}, {x,y,...}] 给出一组化简后的方程, 包括可能的解
NRoot[poly==0, x] 给出多项式的根的数值逼近 FindRoot[lhs==rhs, {x, x0}] 从x0出发, 求方程的数值解 FindMinimum[f, {x,x0}] 在x0附近找f的极小值 In[1]:= Solve[x^2+2x-7==0, x]
In[2]:= Solve[2-4x+x^5==0, x] 呵呵~~~ 输出结果你会发现和没解一样 In[3]:= N[%] 啊, 要数值解啊, 不早说. 这不是么. In[4]:= Solve[{a*x+y==0, 2x+(1-a)y==1},{x,a}]
In[5]:= Eliminate[{3x+2y+z==3, 2x-2y-2z==5,x+y-7z==9}, {x,z}]
In[6]:= Reduce[a*x+b==0, x] 哇, 好COOL. a==0, 怎么怎么; a!=0, ... In[7]:= FindRoot[Cos[x]==x,{x,1}] In[8]:= FindMinimum[x Sin[x], {x,2Pi}] 幂级数
Series[expr, {x, x0, n}] 求expr在x0的n阶幂级数 Normal[series] 按标准形式
In[1]:= Series[(1+x)^n, {x,0,3}] 最后还有近似量级呢(大喔O[x]^4) In[2]:= Normal[%]
In[3]:= %^2 (1+%) 把大喔量级不要了, 多项式当然可以这么运算 极限
Limit[expr, x->x0] expr中x趋于x0 In[1]:= t=Sin[x]/x
In[2]:= t/.x->0 错了吧. 0不能当分母的 In[3]:= Limit[t,x->0] 求极限总可以了吧 特殊函数
Fourier[] 傅利叶变换 InverseFourier[] 反傅利叶变换 In[1]:= {1,1,1,1,-1,-1,-1,-1} In[2]:= Fourier[%] In[3]:= InverseFourier[%] RungeKutta[], ... 等函数 定义函数如下
In[1]:= f[x_]:=x^2+1 math中定义函数:变量后跟_, 然后用:=
In[2]:= f[x_, y_]:=x+y 以上两个定义同时存在并不矛盾, 当f仅使用一个参数, 自动用一式; 为两个参数, 则用二式
In[3]:= f[3] In[4]:= f[3,2] 定义别名
In[1]:= para:=ParametricPlot 用:=来定义别名 In[2]:= para[{Cos[t],t}, {t,0,Pi}]
In[3]:= Alas[para] 查看para是什么的别名
(7)矩阵/表的运算
矩阵的定义Table, Array, IdentityMatrix, DiagonalMatrix; 输出 输入TalbeForm, ColumnForm, MatrixForm, list(其他输出TeXForm, FortranForm, CForm); 及运算: 数乘, 矩阵乘法, Inverse, Transpose, Det, MatrixPower, Eigenvalues, Eigenvectors, 矩阵定义使用的一点 说明.
矩阵的定义
Table[f, {imax}] 包含imax个f的元素(f是规则) Table[f, {i, imin, imax, istep}, {j, ...}, ...]
istep=1可省, imin=1也等于1可再省 Array[a, n] 建立向量a[1], a[2], ..., a[n] Array[a, {m, n}] 建mxn矩阵a Array[a, {m1, m2, ..., mn}] n维张量 IdentityMatrix[n] 生成n维单位矩阵 DiagonalMatrix[list] list元素为对角元 In[1]:= Table[x, {4}] In[2]:= Table[i^2, {i, 1, 4}]
In[3]:= x^%-1 看看表在运算符作用后的结果 In[4]:= D[%, x] 求导也可以 In[5]:= % /. x->3 代入值看看 In[6]:= Array[a, {3, 2}] 看个2维的(3x2)矩阵 In[7]:= DiagonalMatrix[{1,2,3}] 生成对角元是1,2,3的方阵 矩阵的输出/输入
TableForm[list] 以表列格式显示一个表 ColumnForm[list] 写成一列 MatrixForm[list] 按矩阵形式
list[[i]] 第i个元素(一维); 第i行元素(二维) list[[i,j]] list的第i行, 第j列元素. In[1]:= a=Table[i+2*j, {i, 1, 3}, {j, 1, 2}] In[2]:= TableForm[%] 看看表格式 In[3]:= ColumnForm[%%] 写成一列 In[4]:= MatrixForm[%%%} 再看看矩阵形式
In[5]:= %[[2]] 把上面的矩阵的第二行(是一维的表了哦)去来 In[6]:= %%[[2,1]] 取第二行第一列元素(是一个数) 注: In[5],In[6]也可用a[[2]]和a[[2,1]]的典型写法.
其他输出格式 TeXForm, FortranForm, CForm TeX(数学排版)格式, Fortran语言, C语言格式输出 In[1]:= (Sqrt[x^3-1]+Exp[y])/Log[x]
In[2]:= TeXForm[%] 注意TeX中T和X是大写, e是小写 In[3]:= CForm[%] 矩阵的数学运算
cm 数乘(c标量, m是Table或Array定义的矩阵) a.b 矩阵相乘(注意矩阵乘法的规则) Inverse[m] 逆矩阵(当然要对方阵来说了) Transpose[m] 转置
Det[m] m(方阵)的行列式 MatrixPower[m,n] m(方阵)的n次幂 Eigenvalues[m] m(方阵)的特征值 Eigenvectors[m] m(方阵)的特征向量 Eigenvalues[N[m]], Eigenvectors[N[m]] 数值解 In[1]:= a=Table[i+2*j, {i, 1, 3}, {j, 1, 2}] In[2]:= 5a 看看乘积 In[3]:= b=Table[3*i-2^j, {i, 1, 3}, {j, 1, 3}]
In[4]:= b.a 矩阵乘法(注意,此例a.b没有意义) In[4]:= Transpose[%] 转置
In[5]:= Inverse[b] 求一下矩阵的逆(天哪, 是方阵还不行, 还要行列式不为0) In[6]:= Det[b] 果然行列式为0 In[7]:= c=b+{{1,0,0},{0,0,0},{0,0,0}} In[8]:= Inverse[c] 终于可以求逆了 In[9]:= MatrixPower[b,3] b的3次方 In[10]:= Eigenvalues[b] 特征值 In[11]:= Eigenvectors[b] 特征向量
一点说明: 矩阵可以先使用, 再定义; 局部定义和整体定义的顺序也自由. 如: In[1]:= d[1,1]=w; d[1,2]=e; d[2,1]=21; d[2,2]=22;
In[2]:= Array[d,{3,3}] 你就会发现, 定义过的有值了, 没定义的还没有值.
(8)表的运算.2
表的结构VertorQ, MatrixQ, MemberQ, FreeQ, Length, TensorRank, Dimensions, Count, Position; 取表元First, Last, list[[]], Take, Rest, Drop, Select; 插入元素 Prepend, Append, Insert, Join; 表的集合Union, Intersection, Complement; 表的重排Sort, Union, Reverse, RotateLeft, RotateRight, Transpose, Flatten, Partition, Permutations, Apply
计算表的有关结构
VectorQ[list] 检验list是否为向量结构 MatrixQ[list] 检验list是否为矩阵结构 MemberQ[list, form] 检验form是否为list的元素 FreeQ[list, form] 检验form是否不是list的元素 Length[list] list中元素的数目 TensorRank[list] list的深度(看成张量的秩) Dimensions[list] list作为向量或矩阵的维数 Count[list, form] form在list中出现的次数 Position[list, form] form在list中的位置 In[1]:= t={{1,2},3} t是一个表 In[2]:= VectorQ[t] 不是向量 In[3]:= MemberQ[t,3] 3是它的元素 In[4]:= MemberQ[t,2] 2不是它的元素 In[5]:= Length[t] t的长度是2 In[6]:= TensorRank[t] t的深度是1
In[7]:= Dimensions[t] 作为向量,是2维: {1,2}和3 In[8]:= Position[t,3] 3在表t中的位置是{{2}} 在表中取部分元素
First[list] list的首元素 Last[list] list的最后一个元素 list[[n]] list的第n个元素 list[[-n]] list的倒数第n个元素 (以后二者合写为n/-n)
list[[n1,n2,...,nm]] 相当list[[n1]][[n2]]...[[nm]] list[[{n1,n2,...,nm}]] list第n1,n2,...,nm元组成新表 list[[{i1,i2,...},{j1,j2,...}]]
list的i1,i2...行,j1,j2,...列 Take[list, n/-n] 取list的前/后n个元素 Rest[list] 去掉首元的list Drop[list, n/-n] 去掉前/后n个元素的list Select[list, crit] 从list中选出满足crit的元素 In[1]:= t={{2,1},{1}};
In[2]:= VectorQ[t] 函数名最后字母为Q,其值为True/False In[3]:= aa={{a,b,c,d},{e,f,g,h},{i,j,k,l}};
In[4]:= aa[[1]] 看看以下几个, 体会一下取元素/子表 In[5]:= aa[[1]][[2]] In[6]:= aa[[1,2]] In[7]:= aa[[{1,2}]] In[8]:= aa[[{1},{2}]]
In[9]:= Select[{a,23,12,0,3.5},EvenQ] 看看Select怎么用 这里EvenQ[expr]判断expr是否偶数; OddQ[.]奇数?; NumberQ[.]数?; IntegerQ[.]整数?; PrimeQ[.]素数? AtomQ[.]简单表达式?... 表中插入元素
Prepend[list, elem] 表头加elem(PrependTo函数修改list) Append[list, elem] 在表尾加elem(AppendTo修改list) Insert[list, elem, n/-n] 在正/倒数第n个位置插入elem Join[list1, list2, ...] 连接list1, list2, ... In[1]:= Prepend[{a,b,c},x] 在{a,b,c}前加x元素 In[2]:= Insert[{a,b,c},x,2] 在{a,b,c}的第2个位置插入x In[3]:= Join[{1,2,3},{xy},{m,{2,3},3}] 看看Join 集合函数
Union[list1, list2, ...] 去掉重复元并排序后的Join Intersection[list1, list2, ...] 取各list的公共元
Complement[t, list1, list2, ...] 在t中, 不在各list中的元素 In[4]:= Union[{1,2,3},{xy},{m,{2,3},3}] 看看Union In[5]:= Complement[{a,b,c,d,e},{a,d},{e,f}] 看看Complement 表的重排
Sort[list] 将list排序 Union[list] 去掉重复元 Reverse[list] 倒序
RotateLeft[list, n/-n] 将list向左/右转n个元素(n=1可省) RotateRight[list, n/-n] 将list向右/左转n个元素(n=1可省) Transpose[list] 交换表的最上面两层 Transpose[list, n] 交换表的顶层与第n层 Flatten[list] 将list所有层变为一层 Flatten[list, n] 将list的最上面n层变为一层 Partition[list, n] 将list分成由n元组成的块(多余舍去) Partition[list, n, d] 各块中有偏移d
Permutations[list] 给出list一切可能的排列 Apply[Plus, list] 求和list[[i]] Apply[Times, list] 求积list[[i]] In[1]:= RotateLeft[{a,b,c,d,e},2] 得到{c,d,e,a,b} In[2]:= Flatten[{{a,b},c,{c,d}}] 得到{a,b,c,c,d} In[3]:= Table[i^2+j^2+k^2,{i,2},{j,2},{k,2}] In[4]:= Flatten[%,1] 展开一层 In[5]:= Apply[Plus,%] 求和得到{24,36} In[6]:= Partition[{a,b,c,d,e,f,g},3,1] 看看Partition
(9)二维图形
二维函数作图Plot, 选项; 图的重现Show, Options, SetOptions, InputForm, Head; 参数绘图ParametricPlot; 线宽Thickness, 线型Dashing. 二维图形
函数作图
Plot[f[x],{x,xmin,xmax}] 在{xmin,xmax}间画出f[x]的图形 Plot[{f1[x],f2[x],...},{x,xmin,xmax}] 画出fi[x] Plot[Release[f],{x,xmin,xmax}] 有时f的表达式很复杂, 直接用Plot计算量大,可能得不出结果,可以先求f的值,再画 Plot选项设置(格式: 选项->值)
PlotRange Automatic {ymin,ymax}或{{xmin,xmax},{ymin,ymax}} AxesLabel轴标 None {\"x轴标\轴标\ Frame框 False True AxesOrigin原点Automatic {x,y} Axes轴 Automatic None不画
Ticks刻度 Automatic None或{{xticks(,...)},{yticks(,...)}} GridLines网格 None All或{{xlines...},{ylines}} AspectRatio 1/GodenRatio 正实数(高/宽) PlotPoints 15 Plot的作图精度 In[1]:= Plot[Sin[x^2], {x,0,3}]
In[2]:= Plot[Sin[x^2], {x,0,3}, PlotRange->{0,1.2}] In[3]:= Plot[Sin[x^2], {x,0,3}, AxesLabel->{\"x\ In[4]:= Plot[Sin[x^2], {x,0,3}, Axes->None] In[5]:= Plot[Sin[x^2], {x,0,3}, PlotPoints->40]
图形的重现
Show[p] 重画图p
Show[p1,p2,...] 把p1,p2,...重画在一起
Show[p,option->value] 改变选项重画p(选项大多同上) (没有PlotPoits选项) Options[p] 显示图p的选项
InputForm[p] 显示图p的有关存储信息 SetOptions[函数名,option->value] 改变函数选项默认值
Head[p] p的类型,如果p是图,则值为Graphics In[1]:= t1=Plot[BesselJ[1,x],{x,1,20}] In[2]:= t2=Plot[Sin[x],{x,0,15}] In[3]:= Show[t1,%]
In[4]:= Show[%,Axes->None] In[5]:= Show[%,Frame->True] In[6]:= Options[%] In[7]:= InputForm[t2]
参数绘图
ParametricPlot[{fx,fy},{t,tmin,tmax}]
ParametricPlot[{{fx,fy},{gx,gy},...},{t,tmin,tmax}] {fx,fy}的几种特殊情形 {r[t]Cos[t],r[t]Sin[t]} 极坐标
{Re[f],Im[f]} 复函数的相角图 {Log[f],Log[g]} log-log图
注意: 有时需要把AspectRatio->1才能更好地显示y/x比例, 如画圆. In[1]:= ParametricPlot[{Sin[t],Sin[2t]},{t,0,2Pi}] In[2]:= ParametricPlot[{Sin[t],Cos[t]},{t,0,2Pi}] In[3]:= Show[%,AspectRatio->Automatic]
AspectRatio是1或Automatic是y/x的比例才是1
选项,改变线宽和线型(虚线):在Plot的选项里使用
PlotStyle->Thickness[0到1的值] 在math3.0下,使用0.005足矣 PlotStyle->Dashing[{画,空}]
在Show中,在Graphics[Thickness[.]]或Graphics[Dashing[.]] 之后的线宽或线型依此改变.
In[1]:= Plot[Sin[x^2],{x,0,3},PlotStyle->Thickness[0.01]] In[2]:= Plot[Sin[x^2],{x,0,3},PlotStyle->Dashing[{0.01,0.01}]] In[3]:= t1=Plot[Sin[(3x)^2],{x,-1,1}]
In[4]:= t2=ParametricPlot[{Sin[t],Sin[2t]},{t,0,2Pi}] In[5]:= Show[t1,Graphics[Dashing[{0.01,0.01}]],t2] In[6]:= Show[t1,Graphics[Thickness[0.01]],t2]
(10)三维图形
三维函数作图Plot3D, 选项; 参数作图ParametricPlot3D; 等 值线图ContourPlot; 密度图DensityPlot; 数据绘图ListPlot, ListPlot3D. 三维作图 函数作图
Plot3D[f[x,y],{x,xmin,xmax},{y,ymin,ymax}]
在{xmin,xmax}间画出f[x]的Surface图形 Show[p] 重画图p,用法同二维
Show[Gaphics3D[p]] 将图p(可能是SurfaceGraphics)转 为Graphics3D,并重画 三维作图选项
PlotRange Automatic {zmin,zmax}或{{xmin,xmax},{y...},{z...}} Axes轴 Automatic None
AxesLabel None {\"x轴标\轴标\轴标\ Ticks Automatic 刻度 PlotLabel图标 None 图的标记 Boxed盒子 True False BoxRatios {1,1,0.4} {x,y,z}
HiddenSurface True False是否隐去曲面被挡部分 Shading True False是否涂阴影(颜色) Mesh True False是否在曲面上画网格 LightSources 三个光源 设光源{{x,y,z},RGBColor[r,g,b]} FaceGrids None All或坐标网格 ViewPoint视点 {1.3,-2.4,2.} {x,y,z}
{0,-2,0}正前方; {0,-2,2}前上方; {0,-2,-2}前下方; {2,-2,0}正右角; {0,0,2}正上方; ... PlotPoints 15 作图精度
(PlotPoints为Plot3D,ParametricPlot3D,ContourPlot等 plot函数选项)
In[1]:= Plot3D[Sin[x]y^2,{x,-3,4},{y,-2,2}]
In[2]:= Plot3D[Sin[x]y^2,{x,-3,4},{y,-2,2},PlotPoints->30] In[2]:= Show[%, Mesh->False,Boxed->False,Axes->None] 参数绘图
ParametricPlot3D[{fx,fy,fz},{u,umin,umax},{v,vmin,vmax}] 等值线图
ContourPlot[f,{x,xmin,xmax},{y,ymin,ymax}]
选项Contours 10 从zmin到zmax等值线条数 密度图
DensityPlot[f,{x,xmin,xmax},{y,ymin,ymax}]
In[1]:= ParametricPlot3D[{Cos[5t],Sin[3t],Sin[t]},{t,0,2Pi}] In[2]:= ParametricPlot3D[{u,u+v,v^2},{u,0,2},{v,-1,1}] In[3]:= ContourPlot[Sin[x]Cos[y],{x,-2,2},{y,-2,2}] In[4]:= Show[%,Contours->30]
In[5]:= DensityPlot[Sin[x]Cos[y],{x,-2,2},{y,-2,2}] 数据绘图
ListPlot[{y1,y2,...}] 画(1,y1),(2,y2),... ListPlot[{{x1,y1},{x2,y2},...}] ListPlot[...,PlotJoined->True] 连线
ListPlot3D[array] In[1]:= t=Table[i^2,{i,10}] In[2]:= ListPlot[t]
In[3]:= ListPlot[t,PlotJoined->True] In[4]:= tt=Table[Mod[y,x],{x,20},{y,20}] In[5]:= ListPlot3D[%,ViewPoint->{1.5,-0.5,1}]
(11)基本图元作图
二维基本图元Point, Line, Rectangle, Polygon, Circle, Disk, Text, Graphics[]; 三维基本图元Point, Line, Polygon, Cuboid, Text, Graphics3D[]; 一些PlotStyle: Thickness, Dashing, PointSize, GrayLevel, RGBColor.
基本图元绘图 二维基本图元
Point[{x,y}] 点(x,y) Line[{{x1,y1},{x2,y2},...}] 连线 Rectangle[{xmin,ymin},{xmax,ymax}] 矩形 Polygon[{{x1,y1},{x2,y2},...}] 多边形 Circle[{x,y},r] 圆:圆心(x,y),半径r Disk[{x,y},r] 圆盘:圆心(x,y),半径r Circle[{x,y},{rx,ry},{a1,a2}] 椭圆:
圆心(x,y),长短轴rx,ry,起始角a1,终止角a2 Disk[{x,y},{rx,ry},{a1,a2}] 椭圆盘 Text[expr,{x,y}] 文本输出在(x,y) Text[expr,{x,y},{x1,y1}] 文本输出
{x1,y1}为{-1,0},{1,0},{0,1},{0,-1}, 则文本输出以(x,y)
为左端点, 右端点, 上端点, 下端点; 其他-1到1的数为相对位移 In[1]:= s1=Line[Table[{n,(-1)^n},{n,6}]] In[2]:= Show[Graphics[s1]]
In[3]:= g1=Show[%, Axes->Automatic]
In[4]:= Show[g1,Graphics[Text[\"f(x)\
In[5]:= s2={Rectangle[{1,-1},{2,-0.6}],Polygon[ {{1,0},{3,1},{4,0.5},{5,1}}]} In[6]:= Show[g1,Graphics[s2]]
In[7]:= Show[Graphics[Table[Circle[{3n,0},n/4],{n,4}]], AspectRatio->Automatic]
In[8]:=Show[Graphics[Disk[{1,1},{1,2},{10Degree,325Degree}]], AspectRatio->Automatic] 三维图元
Point[{x,y,z}] 点(x,y,z)
Line[{{x1,y1,z1},{x2,y2,z2},...}] 连线 Polygon[{{x1,y1,z1},{x2,y2,z2},...}] 多边形 Cuboid[{xmin,ymin,zmin},{xmax,ymax,zmax}] 立方体 Text[expr,{x,y,z}] 文本输出 一些PlotStyle
Thickness[r] 线宽
Dashing[{r1,r2,...}] 虚线{实虚实虚...} PointSize[r] 点的大小 GrayLevel[r] 灰度0<=r<=1 RGBColor[r,g,b] RGB颜色([0,1]间) [1,0,0]红; [0,1,0]绿; [0,0,1]蓝; [1,1,0]黄 In[1]:= Plot[Sin[x^2],{x,0,3},PlotStyle->RGBColor[1,0,0]] In[2]:= Show[%,Graphics[PointSize[0.05]],Graphics[Point[{2,1}]]]
In[3]:= Show[Graphics3D[RGBColor[1,0,0]],Graphics3D[ Line[{{0,0,0},{1,2,3},{3,2,1}}]]]
(12)表达式与纯函数
表达式形式FullForm, TreeForm, Head; 表达式的书写形式 @, //, ~f~; 表达式的项expr[[n]]; 表达式操作Apply(@@), Nest, Map(/@), MapAll(//@), MapAt; 纯函数&, #, ##.
表达式形式
FullForm[expr] 给出表达式的完全形式 TreeForm[expr] 给出表达式的完全形式 Head[expr] 给出表达式的头部 In[1]:= FullForm[x+y+z] x+y+z的FullForm是Plus[x,y,z] In[2]:= FullForm[1+(x y)^2+(y+z)^3]
In[3]:= TreeForm[%] In[4]:= Head[%] In[5]:= Head[215] In[6]:= Head[21.5]
In[7]:= Head[Plot[Sin[x],{x,0,1}]] 表达式的四种书写形式
f[x,y] 标准形式 f@x f[x]的前缀形式 x//f f[x]的后缀形式 x~f~y f[x,y]的中间形式 In[1]:= Pi^2//N 相当于N[Pi^2](//级别低) In[2]:= N@Pi^2
In[3]:= {a,b,c}~Join~{c,d} 表达式的项
expr[[n]] expr的第n项 expr[[-n]] expr倒数第n项 expr[[n1,n2,...]] 树结构索引的expr的项 expr[[n]]=expr2 项赋值
Position[expr,form] 寻找expr中form的位置 In[1]:= t=1+(3+x)^2+z;
In[2]:= t[[2]] 得(3+x)^2(类似于取List的元素) In[3]:= t[[2,1]] 再取子表得到Power函数的(3+x) In[4]:= t[[4]] 出错,不存在 In[5]:= t[[3]]=y*z 试试直接赋值 In[6]:= t 看看t变成什么了 表达式的操作
Apply[f,list] 对list施加函数f (@@) Nest[f,x,n] 将f对x作用n次
Map[f,expr] 将f作用于expr的第一层 (/@) Map[f,expr,n] 将f作用于expr直到第n层
MapAll[f,expr] 将f作用于expr的所有项 (//@) MapAt[f,expr,{polist}] 将f作用于expr的polist位置上 In[1]:= Apply[f,{a,b,c}] 得到f[a,b,c](同f@@{a,b,c}) In[2]:= Nest[f,x,3] 得f[f[f[x]]] In[3]:= u=x+(x+2)^2/x
In[4]:= Map[f,u] 同f/@u In[5]:= Map[f,u,2]
In[6]:= MapAll[f,u] 同f//@u
In[7]:= MapAt[f,u,Position[u,x]] 所有x都换成f[x] 纯函数
& Function纯函数 # 纯函数的第一个变量 #n 纯函数的第n个变量 ##n 从第n个起的变量序列 ## ##1
Function[x,expr] 有一个变量的纯函数 Function[{x1,x2,...},expr] 列表参数的纯函数 In[1]:= Map[#^2&, {a,b,c}] 甚至#^2& /@ {a,b,c} 即 将函数#^2作用于{a,b,c}得到{a^2,b^2,c^2} In[2]:= (#1^2+#2^#3)&[x,y,3] 即x^2+y^3 In[3]:= g[##,##]&[x,y] 得g[x,y,x,y]
(13)转化规则与参数
转换规则f[x]=, f[x_]=, Clear; 模式与匹配; 赋值=和:=; /; , -> , :> , /. , //. , Replace, /: ; 参数的含义_, __, ___, _head, _:xdef.
转换规则
f[x]=expr 定义f在x的值 f[x_]:=expr 定义f[x](区别=与:=) Clear[f]或f[x_]=. 清除f的定义
Remove[f] 彻底清除变量或函数f
In[1]:= f[x]=x^2 定义f在x为x^2
In[2]:= f[2]+f[x] f[2]未定义,所以得到f[2]+x^2 In[3]:= g[x_]=x^2 定义g[x](这里x没有值,:=与=一样) In[4]:= g[2]+g[x] 得到4+x^2 (注意看f和g的区别) In[5]:= f[3]=10 再定义一个f[3] In[6]:= ?f 看看f 模式与匹配
f[n_], f[m_,n_], f[n_,n_] In[1]:= f[m_,n_]:=m+n In[2]:= f[n_,n_]:=3*n In[3]:= f[n_]:=2*n
In[4]:= f[2,2]+f[6,8] f[2,2]用的是f[n,n]而不是f[m,n] In[5]:= f[2]+f[6,8] f[2]用单参数规则,f[6,8]用双参数规则 赋值
= 立即赋值 := 到使用时再赋值 In[1]:= y=2
In[2]:= h[y_]=y^3 即时赋值 In[3]:= h[1] =8
In[4]:= h2[y_]:=y^3 使用时再赋值,这里只定义规则 In[5]:= h2[1] =1 (注意h2与h的区别) In[6]:= ?h
In[7]:= ?h2 分别看看就知道了
In[8]:= 3! 下面再熟练一下=和:=的区别 In[9]:= f[x_]:=%+2x In[10]:= 1+y^2 In[11]:= g[x_]:=%+2x In[12]:= 2+z
In[13]:= f[a]+g[a] In[14]:= f[a]*g[a]
/; (表达式/;条件) 满足条件使用表达式 -> (lhs -> rhs) 在定义时,lhs用rhs代替 :> (lhs :> rhs) 在使用时,lhs用rhs代替 /. (expr /. rule) 对expr所有项使用规则一次
//. (expr //. rule) 对expr所有项使用规则直到结果不变化 Replace[expr,rule] 对整体expr使用规则一次 /: (g/:lhs:=rhs) 定义一个转换规则,与g相关联 In[1]:= f[x_]:=1 /; -1<=x<=1 当-1<=x<=1时, f[x]=1 In[2]:= f[x_]:=-1 其他时候f[x]=-1 In[3]:= f[2]
In[4]:= f[0.5] 分段函数耶 In[5]:= Plot[f[x],{x,-2,2}] 画图看看, 不错不错
In[6]:= x+y /. x->2 得到2+y(:>和->的区别类似于:=与=) In[7]:= Clear[f]
In[8]:= f[5] /. {f[1]->1,f[x_]->x*f[x-1]} In[9]:= f[5] //. {f[1]->1,f[x_]->x*f[x-1]} In[10]:= ss /: math[ss]=96 In[11]:= ss /: phys[ss]=95 In[12]:= ?ss 参数
x_ 单个表达式x
x__ 一个或多个表达式序列x x___ 0个或多个表达式序列x x_h (或x__h) Head是h的表达式(序列) x_:xdef 可省参数的缺省值 In[1]:= nt[t_,lt__]:=t*lt In[2]:= c={1,2,3,4}
In[3]:= nt[3,c] 这里就使用c是列表参数 In[4]:= li[x_,xi_,xj__]:=(x-xj)/(xi-xj) In[5]:= li[x,xi,{1,2}] 再看个例子
In[6]:= h[x_Real]:=x^2 定义h,当x是Real时 In[7]:= h[4.5] h[4.5]的值为20.25
In[8]:= h[a] a的Head不是Real,未定义,得h[a] In[9]:= fac[0]=1 以下看看函数fac In[10]:= fac[n_Integer?Positive]:=n*fac[n-1]
In[11]:= fac[5] 120(注意上面条件用?间隔) In[12]:= h2[x_?NumberQ]:=x^3 看看这个条件的使用 In[13]:= f[x_,y_:1,z_:2]:=g[x,y,z]
In[14]:= f[a1,b1,c1] 都有参数则按参数代入 In[15]:= f[a1,b1] 少一个参数,使用缺省值
In[16]:= f[a1] 只有一个参数,两个参数使用缺省
(14)mathematica过程编程
一般过程, Block; 循环Do, While, For, Nest, FixedPoint; 条件If, Which, Switch; 转向Return, Break, Continue, Goto, Label.
一般过程
Command; Command; ... 一串命令 Block[{x,y,...},procedure] x,y,...为局部参数 Block[{x=x0,y=y0,...},proc] 局部参数赋初值 In[1]:= g[x_]:= Block[{u},u=(1+x)^2;u=Expand[u]] In[2]:= g[a+b] 看看g[a+b]=? In[3]:= u 而这时u不发生改变 循环结构
Do[expr,{i,imin,imax,istep}]
计算expr,i从imin到imax,步长istep Do[expr,{i,imin,imax}] istep=1 Do[expr,{i,imax}] imin=1,istep=1 Do[expr,{n}] 计算expr n次
Do[expr, {i...}, {j...}...] 多重循环(前面的外重循环) While[test,expr] 当test成立, 计算expr
For[start,test,increment,body]
相当于C语言for(start;test;increment) body Nest[f,expr,n] f对expr作用n次
FixedPoint[f,expr] 重复使用f,直到expr不再变化 用于循环的表达式
i++, i--, ++i, --i, i+=di, i-=di, i*=di, i/=di, {x,y}={y,x} x,y值交换
In[1]:= Do[Print[i^2],{i,4}] 循环Print[i^2] In[2]:= t=x;Do[t=1/(1+k*t),{k,2,4}];t In[3]:= Do[Print[{i,j}],{i,4},{j,i-1}]
In[4]:= Nest[Function[t,1/(1+t)],x,3] 注意虚函数的使用 In[5]:= FixedPoint[Function[t,Print[t];Floor[t/2]],67] In[6]:= n=17;While[(n=Floor[n/2])!=0,Print[n]] In[7]:= For[i=1,i<4,i++,Print[i]]
In[8]:= For[i=1;t=x,i^2<10,i++,t=t^2+i;Print[t]]
大家注意练习上面例子, 考虑并看看运行结果, 熟练Math的循环 语句的使用. 条件语句
If[test,expr] if (test) expr
If[test,expr1,expr2] if (test) expr1 else expr2 If[test,expr1,expr2,expr3] 无法判断时得值expr3 Which[test1,value1,test2,value2,...True,value]
test1为真,得value1;否则判断test2...;若全不满足,得Null Switch[expr,form1,value1,form2,value2,...]
expr的值为form1,得value1; 为form2,得value2,... In[1]:= f[x_]:=If[x>0,1,-1]
In[2]:= Plot[f[x],{x,-2,2}] 还是画图形象 In[3]:= g[x_]:=Which[x>1,x+2,x<-5,x-2] In[4]:= g[0] 没有输出 In[5]:= Print[g[0]] 看到了,是Null
In[6]:= g[-6]
In[7]:= g[2] 这两个g值都有意义 In[8]:= h[x_]:=Switch[Mod[x,3],0,a,1,b,2,c]
In[9]:= h[4] 也可以看看h[5],h[6]等值 转向控制
Return[] 返回,当前函数值Null Return[expr] 返回expr的值
Break[] 和 Continue[] 这两函数只用于For,While. (Do不使用) Goto[标志]和Label[标志]
(15)程序包
程序包的结构, 上下文, 程序注释, 输出, 输入 程序包的结构 BeginPackage[\"self`\"] 激活或建立self上下文 f::ussage=\"....\" f的用法说明 Begin[\"`Private`\"] 开始包的私有上下文 .... f[args]=... ....
End[] 结束自身的上下文
EndPackage[] 结束包,将self`放在全局上下 文路径的最前面 如果第一句为BeginPackage[\"self`\则在定义 包self时, 同时打开f1.m, f2.m, 调入f1`, f2`. 名字和上下文
上下文表示为 字符串`
name 在当前上下文或搜索路径中最先找到的符号 context`name 在指定上下文中的符号 `name 在当前上下文中的符号 Unique[ss] 生成以ss开头的没用过的符号
Clear[s] 清除s的值 Remove[s] 清除符号s
Remove[\"context`*\"] 清除context上下文中的所有符号 这里要提一下两个系统变量: $Context和$ContextPath, 前 者为当前上下文, 后者为当前上下文路径. 关于上下文, 大 家看看以下例子, 体会一下.
In[1]:= $Context 当前上下文是Global` In[2]:= z=6 定义z=6 In[3]:= Begin[\"new1`\"] 开始new1上下文 IN[4]:= new1`z=9 new1上下文中的z=9 In[5]:= $Context 当前上下文是new1` In[6]:= z 看看z=9
In[7]:= ?*`z 看看有几个z,其中有z和Global`z In[8]:= EndAdd[] 结束new1`,并将new1`放在路径最前面 In[9]:= $ContextPath 看看路径
In[10]:= ?*`z 看看有几个z,其中有z和new1`z In[11]:= z 看看现在z的值是Global的z值了 In[12]:= $Context 当前上下文 In[13]:= Remove[z] 清除变量z
In[14]:= z Global的z清除了,这时显示的z=9 In[15]:= Remove[z] 再Remove就清除new1中的z了
程序注释
f::ussage=\"text...\" 关于一个函数的说明 (* 注释内容 *) 出现在程序包的任何地方 如If[x>y,(* then *)x,(* else *) y]和If[x>y,x,y]是一样的. 输出
Print[expr1,expr2,...] 在屏幕上输出expr1,expr2,... StringForm[string,expr1,expr2,...] 将string中成对的``依次
用expr1,expr2,...代替. 若string中是`n`, n为整数, 则用 第n个expr代替.
如StringForm[\"`` is not ``.\输出x+1 is not y. Message[s::tag] 输出tag Off[s::tag] / On[s::tag] 屏蔽/打开tag信息
In[1]:= f::\"overflow\"=\"Factorial argument `1` too large.\" In[2]:= f[x_]:=If[x>10,Message[f::\"overflow\ In[3]:= f[20] 输出错误信息 In[4]:= Off[f::\"overflow\"] 屏蔽overflow信息 In[5]:= f[20] 表达式输出到文件
expr >> file 把表达式的值写入新文件file expr >>> file 把表达式的值追加到file中 !!file 显示文件 输入
Input[] 键盘输入完整表达式作为Input的返回值 Input[提示] 显示提示,接受输入 InputString[] 输入字符串
Read[文件名,类型描述] 按类型描述读入文件,参看帮助
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务