个人工具
登录
查看“Maxima在线性代数的应用”的源代码 - Ubuntu中文
页面
讨论
查看源代码
历史
搜索
导航
首页
最近更改
随机页面
页面分类
帮助
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息
查看“Maxima在线性代数的应用”的源代码
来自Ubuntu中文
←
Maxima在线性代数的应用
跳转至:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
==线性代数相关指令== 这节我们正式介绍线性代数相关,也就是矩阵相关的指令。 ===矩阵及向量=== 我们先来看矩阵和向量的定义方式。前面说过,在Maxima 里,所谓设定一个变数的值,只不过是给某个数字或矩阵等等一个名称。我们这里就举应用在矩阵和向量时的情况: (%i1) A:matrix([1,2,3],[-2,8,3],[1,4,9]); [ 1 2 3 ] [ ] (%o1) [ - 2 8 3 ] [ ] [ 1 4 9 ] (%i2) v: [2,3,5]; (%o2) [2, 3, 5] 我们可以看出,要定义一个矩阵,就是把矩阵一列列的输入;定义一个向量,其实和我们用手写向量出来也差不多。不过,问题是我们在线性代数常常要把向量写成「行向量」,而非如上的「列向量」表示方式。我们可以用下面两种不同的方式达成: (%i3) v:transpose([2,3,4]); [ 2 ] [ ] (%o3) [ 3 ] [ ] [ 4 ] (%i4) v:matrix([2],[3],[5]); [ 2 ] [ ] (%o4) [ 3 ] [ ] [ 5 ] 其实向量应该是一个一列或一行的矩阵, 但是Maxima 提供了简单定义列向量的方法。这里要强调一点, 一般来说因为矩阵乘法的关系, 我们写成列向量和行向量差别很大。不过Maxima 其实不太在意这点: 它可以聪明地发现你要做的事, 并且正确得计算出来!简单的说, 一般而言, 我们不需要麻烦得定义行向量, 用列向量即可。 === 矩阵的表示和截取=== 这节我们讨论矩阵的抽象表示和取出一个矩阵行,列,甚至entry 的方法。这在很多理论和计算的尝试会用到。Maxima 是一个CAS 系统,所以我们可以完全用符号去定义一个矩阵,比方说: (%i5) A: matrix([a[1,1],a[1,2]],[a[2,1],a[2,2]]); [ a a ] [ 1, 1 1, 2 ] (%o5) [ ] [ a a ] [ 2, 1 2, 2 ] 你也可以做完全抽象的代数计算: (%i6) c*A; [ a c a c ] [ 1, 1 1, 2 ] (%o6) [ ] [ a c a c ] [ 2, 1 2, 2 ] 如此一来,我们要试著导出一些定理就非常方便! 现在,我们重新把A 定义成一个实数矩阵,再看看怎么样找出A 的某一列,某一行,或某个entry。 (%i7) A: matrix([1,2,3],[-2,8,3],[1,4,9]); [ 1 2 3 ] [ ] (%o7) [ - 2 8 3 ] [ ] [ 1 4 9 ] (%i8) row(A,1); (%o8) [ 1 2 3 ] (%i9) col(A,2); [ 2 ] [ ] (%o9) [ 8 ] [ ] [ 4 ] (%i10) A[2,3]; (%o10) 3 === 矩阵向量之四则运算=== 我们要做矩阵加法、减法、乘法非常直觉而容易。乘法用的运算元是“.”。我们假设有了前面矩阵A 和向量v 的定义,来看以下的例子: (%i11) A.v; [ 23 ] [ ] (%o11) [ 35 ] [ ] [ 59 ] 也可以定义非向量的矩阵试试矩阵的乘法。比方说,两个矩阵A , B 的乘积是A.B,要注意A*B 并不会得到矩阵相乘的结果!到底A*B 是什么意思,大家不妨自己试试,看可不可以找出其中的意义。 量内积的做法和你想的一样: (%i12) w: [2,3,5]; (%o12) [2, 3, 5] (%i13) w.w; (%o13) 38 你可能发现了一个问题,那就是我们上面内积的例子是用列向量。那行向量可以吗?可以的!Maxima会聪明的知道你想做什么,不信可以试试看。 矩阵和向量的纯量乘法是用平常的“*” 号: (%i14) 2*A; [ 2 4 6 ] [ ] (%o14) [ - 4 16 6 ] [ ] [ 2 8 18 ] 现在我们来看一下有可能会产生误会的地方。假设我们现在要算A · A ,你可能会想是A^2,结果并不正确!其实A^2 是把A 的每一个entry 都平方。正确计算A · A 要用A^^2 === 矩阵相关函数=== 我们要计算矩阵的行列式值,求转置矩阵, 矩阵的秩等等的基本运算,Maxima 当然也都有(A还是我们之前定义的矩阵): (%i15) transpose(A); [ 1 - 2 1 ] [ ] (%o15) [ 2 8 4 ] [ ] [ 3 3 9 ] (%i16) determinant(A); (%o16) 54 (%i17) rank(A); (%o17) 3 我们当然也可以手动计算行列式值。但这时需要知道矩阵第i, j 这个位置的子式(minor), 也就是A 矩阵去掉第i 列, 第j 行所成的矩阵, 这指令叫minor: (%i18) minor(A,1,1); [ 8 3 ] (%o18) [ ] [ 4 9 ] 矩阵的余因子(cofactor) 在Maxima 中并没有定义, 好在我们自己可以很容易定一个cofactor函数: (%i19) cofactor(M,i,j):=(-1)^(i+j)*determinant(minor(M,i,j)); i + j (%o19) cofactor(M, i, j) := (- 1) determinant(minor(M, i, j)) (%i20) cofactor(A,1,1); (%o20) 60 我们在计算反矩阵等会用到的古典伴随矩阵(classical adjoint matrix) 也很容易算出来: (%i21) adjoint(A); [ 60 - 6 - 18 ] [ ] (%o21) [ 21 6 - 9 ] [ ] [ - 16 - 2 12 ] 说到反矩阵,要用Maxima 求出来也是易如反掌: (%i22) invert(A); [ 10 1 1 ] [ -- - - - - ] [ 9 9 3 ] [ ] [ 7 1 1 ] (%o22) [ -- - - - ] [ 18 9 6 ] [ ] [ 8 1 2 ] [ - -- - -- - ] [ 27 27 9 ] 或是你也可以用前面的方式求反矩阵: (%i23) A^^(-1); [ 10 1 1 ] [ -- - - - - ] [ 9 9 3 ] [ ] [ 7 1 1 ] (%o23) [ -- - - - ] [ 18 9 6 ] [ ] [ 8 1 2 ] [ - -- - -- - ] [ 27 27 9 ] 在解线性方程组常用到的梯形矩阵也是容易得很: (%i24) echelon(A); [ 1 2 3 ] [ ] [ 3 ] (%o24) [ 0 1 - ] [ 4 ] [ ] [ 0 0 1 ] === 使用模组=== 用了Maxima 一阵子,你可能会预期它该会的都会。比方说求一个矩阵的trace,这应该够容易了吧? 事情并不是那么简单。Maxima 本身是「不会」算trace 的!当然我们可以自己写个小程序,不过先别急。我们可以使用使用适当的模组来做这件事。 所谓模组就是一段小程序,通常是增加一些指令,供你使用。你也许会觉得奇怪,那为什么Maxima 不一开始就把这些模组都加进来?那是因为如此一来太占用内存,也许很多对某些人重要的指令你永远也不用去用! 我们要算一个矩阵的trace,要使用ncharl 这个模组,这个模组提供了mattrace 指令去计算trace。 使用的方法如下,先以 (%i25) load("ncharl"); 读入ncharl 模组,接著就可以使用这个模组提供的指令: (%i26) A:matrix([1,2,3],[2,2,1],[3,3,1]); [ 1 2 3 ] [ ] (%o26) [ 2 2 1 ] [ ] [ 3 3 1 ] (%i27) mattrace(A); (%o27) 4
返回至
Maxima在线性代数的应用
。