Maxima在线性代数的应用
作者:蔡炎龍
原文:html
简体整理:dbzhang
本文:pdf
状态:整理中...
简介
这篇文章,是介绍Maxima 这套数学软件,在学习线性代数的应用。
Maxima 是一个所谓的「电脑代数系统」(Computer Algebra System, CAS),这种系统比较为人熟知的还有Mathematica 和Maple 等等。我们选定Maxima 做为我们使用的程序,主要有三个原因:
- 免费
- Maxima 是免费,又是各平台都有的。所有的人可以在自己的电脑上练习。
- 功能完整
- Maxima 虽然不要钱,并不代表不好。Maxima 不论计算或图形功能都十分完整。事实上,Maxima 是最早的全功能CAS 系统Macsyma 的后代。
- 具代表性
- 许多新的CAS 系统,如Maple, Mathematica 都多少受到Macsyma 的启发。所以学会Maxima,要学会Maple 或Mathematica 等软件都是很容易的事。
这篇文章主要是介绍线性代数相关功能。我们不假设同学已会基本的Maxima 使用方式,所以我们会用到的概念,也许不纯粹是线性代数的,也会一并介绍。专就线性代数而言,我们要会的其实并不多。想要快速进入状况,可以跳过前面的部份,直接看线性代数相关指令,在操作上有问题时,再回头看有问题部份的相关说明即可。
如果同学们比较喜欢使用Mathematica,Maple,或是Matlab 等商业软件也是可以的。我们系上的电脑室有提供这些软件,可以上机试用看看。
基本概念
我们先介绍一下Maxima 操作的方式。
Maxima 当计算器
我们先来看,如果我们要把Maxima 当计算器用,会是什么情况?
(%i1) 1+1; (%o1) 2 (%i2) 3*4*7; (%o2) 84 (%i3) 9/3; (%o3) 3
到目前为止,似乎还没什么特别。除了可以做复杂一点点的运算,和平常的计算机或数值计算软件也没什么不同。以下的例子就不一样了:
(%i4) 7/3; 7 (%o4) - 3 (%i5) 1/2+2/3; 7 (%o5) - 6
从(%o4)我们看到,7/3这种运算,Maxima 不是告诉我们2.3333...,而是分数的形式!难道Maxima 真的懂分数?不要怀疑,这就是所谓电脑代数系统(CAS) 的特长。我们可以像(%o5)的例子一样,输入个分数的四则运算试试即知。
如果坚持要用浮点数,那只要加个float 指令即可:
(%i6) float(7/3); (%o6) 2.333333333333334
为了完整,我们顺便再介绍指数,根号,阶乘表示法:
(%i7) 2^10; (%o7) 1024 (%i8) sqrt(9); (%o8) 3 (%i9) 5!;
我们可以看出,这些运算不是自然的数学符号,就是和我们平常电脑程序语言的写法。
指令结尾
在上面的例子中,我们发现,在Maxima 下指令,结束时一定要打上分号「;」,让Maxima 知道我们下的指令已结束。为什么要多这一个动作,主要是为了有时打比较长的指令可以换行之故。另一个结束方式是打入「$」的符号。不同於分号的地方是「运算结果不会显示出来」:
(%i10) 2+3$ (%i11) 2+3; (%o11) 5
有一些CAS 程序,如Matehmatica 是用分号表示不显示运算结果。不过Maxima 中分号已用上,必需用其他字符。
离开Maxima
离开Maxima 打入“quit();” 即可。
当然,很多人可能会觉得奇怪,为什么不是打入“quit” 就好了呢?原来像这种程序导向的语言,什么动作其实都是执行一个函数。所以我们事实上是执行一个叫「离开」的函数。这函数没有参数,所以就成了quit() 的形式。
结果的引用
我们时常会需要引用前面的结果,这时就用百分比符号“%” 。比方说:
(%i12) 7/3; 7 (%o12) - 3 (%i13) float(%); (%o13) 2.333333333333334
Maxima 也可以指定使用第几个输出的结果,不过自己定一个标签可能是最好的方式。比方说,我们可以这样用:
(%i14) myresult:34+(65*72)/119; 8726 (%o14) ---- 119 (%i15) float(myresult); (%o15) 73.32773109243698
重要常数
Maxima 当然有内建e 或是π 常常用到的数,只是表示法奇怪一点。e 是%e 而π 是%pi 。
定义变量
Maxima定义变量的想法有点特别,在定义一个变数时,其时是给某个数字、矩阵,或想要定义的任何式子等等一个标签。让我们来看几个例子:
(%i16) a: 37; (%o16) 37 (%i17) a; (%o17) 37 (%i18) b: 22+100*(375-128); (%o18) 24722 (%i19) a+b; (%o19) 24759
函数
Maxima 函数的定义和使用非常直觉,我们看几个例子就知道:
(%i20) f(x) := 3*x^2+5; 2 (%o20) f(x) := 3 x + 5 (%i21) f(2); (%o21) 17 (%i22) g(x, y) := sin(x)*cos(y); (%o22) g(x, y) := sin(x) cos(y) (%i23) g(2*%pi, 4); (%o23) 0
重点就是,在定义函数时要用“:=” 去定义。比较一下和变数定义的不同,想想为什么要有两种不一样的定义方式。
进阶使用
列式而不运算
我们先计算一个瑕积分,用到无穷大的部份Maxima 是以inf 表示:
(%i1) integrate(%e^(-x^2),x,0,inf); sqrt(%pi) (%o1) --------- 2
还记得这在微积分是怎么积出来的吗?Maxima 居然会积!不过,今天这不是我们的重点。今天重点是,有时你不是要秀答案,只是要列出式子。我们要怎么样让Maxima 不要太自动就算出来呢?答案是加个“”号在前面,例如:
(%i2) 'integrate(%e^(-x^2),x,0,inf); inf / 2 [ - x (%o2) I %e dx ] / 0
kill 指令
有时我们设定了一堆变数,函数,后来又不想再用下去,可以用kill 指令。而kill(all) 更是把我们定义过的变数,函数全部删除。看些例子就更加清楚:
(%i3) f(x) := 3*x^2+5; 2 (%o3) f(x) := 3 x + 5 (%i4) f(x); 2 (%o4) 3 x + 5 (%i5) kill(f); (%o5) done (%i6) f(x); (%o6) f(x)
ev的使用
我们可以把Maxima 的ev 指令想成一个独立的环境。有点像在写程序时的函式一样, 并不会影响到其他的运作。第一种ev 的应用是把我们设成不要执行的指令执行:
(%i7) f: 'integrate(x^2, x); / [ 2 (%o7) I x dx ] / (%i8) ev(f, integrate); 3 x (%o8) -- 3
另一个很有用的使用方式是, 我们有个式子, 比方说:
(%i9) f: a*x^2+b*2+c; 2 (%o9) a x + c + 2 b
假设我们想令一个式子是a = 1, b = −2, c = −8 的情况, 我们当然可以先令各个变数是这样,们问题是这么一来, f 也永远是x2 − 2x − 8, a, b, c 这三个变数也不再是「符号」, 而是有值的。为了避免这个问题, 我们可以用ev 指令, 在下了这个指令后, 我们可以发现, 并没有变动到原来a, b, c或是f :
(%i10) g: ev(f, a=1, b=-2, c=-8); 2 (%o10) x - 12 (%i11) a; (%o11) a
线性代数相关指令
这节我们正式介绍线性代数相关,也就是矩阵相关的指令。
矩阵及向量
我们先来看矩阵和向量的定义方式。前面说过,在Maxima 里,所谓设定一个变数的值,只不过是给某个数字或矩阵等等一个名称。我们这里就举应用在矩阵和向量时的情况:
线性代数应用实例
特征值和特征向量
我们这里讨论线性代数很重要的特征值相关的计算。我们定义一个矩阵A , 计算特征值和特征向量时我们都以这个矩阵为主要讨论对象:
手动特征值的计算
上一节介绍Maxima 内建特征值计算,并不一定每个人都喜欢。比方说显示的方式比较特别,另外就是不是一步一步算的,心里有时也有不踏实的感觉。因此,我们这里介绍一下如何用Maxima 一步一步的把特征值求出来。
我们再用一次上一节的例子:
解线性方程组
线性代数的核心问题,就是解线性方程组。解线性方程组一样可以用上一节介绍的solve 指令来解。我们来看一个简单的例子,并且用Maxima 来解。
我们考虑下面的线性方程组:
手动求特征向量空间的基底
我们在前面介绍过, 使用eigenvectors 指令就可以求出特征向量空间的一组基底。我们再用一次前面的矩阵:
Maxima 的绘图功能
二维绘图
Maxima 二维绘图的指令是用plot2d。比方说,我们要画4x3 − 2x − 2 这个函数,设定x 轴范围是从-5 到5,就下这个指令:
(%i1) plot2d([4 * x^3-2 * x-2],[x,-5,5]);
三维绘图
三维绘图也一样容易,只要改用plot3d 的指令即可:
(%i2) plot3d(cos(-x^2+y^3/4),[x,-4,4], [y,-4,4]);
Geomview 是一个UNIX 的软件,Maxima 可以运用Geomview 做出非常漂亮的3D 图形。我们来看上个例子以Geomview 输出的结果。
(%i3) plot3d(cos(-x^2+y^3/4),[x,-4,4], [y,-4,4], [plot_format,geomview]);
Geomview 不但可以画出漂亮3D 图形,更重要的是它可以弥补Maxima 的一些缺点。比方说,Maxima 本身的3D 绘图不可以同时显示两个或两个以上函数图形(2D可以),但利用Geomview,这样的绘图变成可能。
点绘图
有很多绘图的应用,就只需要画出点,或是用一些点来描述一些函数。这事实上比画函数还简单,但是Maxima 直到5.9.2 版才有这样的功能。详情请参考(5.9.2 之后的) 使用手册。
多个函数的绘图
如果要比较几个函数,要如何下指令呢?我们来看个例子就明白了:
(%i4) plot2d([cos(x), sin(x), tan(x)], [x, -2*%pi, 2*%pi], [y,-2,2])$
这个例子会同时画出cos(x), sin(x) 和tan(x) 的图形。
参数式绘图
我们仅简单举一参数式绘图之例子, 详情请参考Maxima 使用手册。
(%i5) plot2d([parametric, cos(t), sin(t), [t,-2*%pi,2*%pi], [nicks,80]]);