使用 Maxima 探索高等数学

作者: Mike Diehl

当我在大学学习微积分时,我的教授会对我们在考试中因轻微算术错误而做错的题目给予大量的部分分数,这样做也是理所当然的。有时,即使是听起来很简单的问题,也需要整整一页甚至更多的计算。仅仅是在问题早期将 -1 更改为 +1 就可能造成完全的灾难性后果。避免此类简单错误正是计算机代数系统 (CAS) 的意义所在,我发现 Maxima 是一款极其强大的 CAS 程序。

Maxima 在 GPL 许可下授权,所以它一定是好用的!然而,Maxima 是一个基于文本的程序,这意味着按照今天的标准来看,它有点笨拙。幸运的是,有一些前端可以使程序更易于使用,也更加完善。在本文中,我使用的是 wxMaxima 前端。

任何上过高中代数课的人都记得花费大量时间分解多项式、将它们相乘以及为给定的 x 值求值。分解多项式似乎总是带有一些猜测的成分,我发现这非常令人沮丧。当然,老师花了数周时间教授分解这些公式的各种方法,然后他们最终介绍了二次方程,这使得分解二阶多项式几乎变得微不足道。对于那些不完全痴迷于数学的人来说,二阶多项式就像这样:ax^2 + bx + c,其中最高指数是 2。

如图 1 所示,使用 Maxima 操作多项式非常容易。在这里,您可以看到我要求 Maxima 执行的 7 个步骤。我的命令用“%i”和步骤编号表示。相应的输出用“%o”和步骤编号表示。因此,(%i90) 是我的第 90 个输入步骤,结果在 (%o90) 指示的行上。因此,在步骤 90 中,您看到我输入了一个简单的多项式方程。然后我要求 Maxima 对其进行因式分解。在这里,您看到我使用了一个快捷方式。“%”字符表示上一步的返回值。因此,当我输入“factor(%);”时,Maxima 检索了上一步的值(该多项式)并对其进行了因式分解。预期结果在下一行。在步骤 92 中,我输入了两个多项式相乘。如您所见,Maxima 没有立即对这个公式做任何特殊处理。但是,当我要求它展开公式时,它将两者相乘,如您在步骤 93 中所见。在步骤 94 中,我要求 Maxima 对结果的 4 阶多项式进行因式分解,瞧,我们得到了原始方程,正如我们所期望的那样。我不认为我们在高中代数中甚至讨论过分解 4 阶多项式!但是我们做了很多在给定 x 值下评估多项式的工作,我在步骤 95 和 96 中对此进行了演示。在步骤 95 中,我为 x 赋值。在步骤 96 中,我重新输入多项式,Maxima 计算了它在给定 x 值下的值。

Figure 1
图 1. 操作多项式

当然,如图 2 所示,Maxima 还可以符号和数值方式求解方程。在这里,我们看到我要求它求解一个二次方程,它以符号形式给我答案。然后我使用“numer”指令要求 Maxima 以数值形式给出答案,它在步骤 13 中做到了。最后,我要求 Maxima 使用 25 位精度,而不是默认的 16 位,并重新计算。Maxima 将计算到您想要的任何精度,并且可以处理任意大的数字。例如,Maxima 可以轻松处理 2^200,甚至可以分解 (2^200)-1。

Figure 2
图 2. 符号和数值运算

Maxima 甚至可以处理您从没想过要手动进行的计算。例如,您可以要求 Maxima 求解一个 4 阶多项式方程,它会给出您所有 4 个解,包括实数和复数。然而,以符号形式表示,这些解通常非常丑陋,以至于会滚出屏幕!但是,您可以转过头来要求它以数值形式给出相同的答案,达到您需要的任何精度。

Maxima 使用 GnuPlot 或 Xmaxima 绘制表达式,并且可以绘制 2D、3D 和参数方程。在图 3 中,我输入了一个相当复杂的表达式,并要求 Maxima 在 2D 图上绘制它。在图 4 中,我从 Maxima 的文档中取了一个示例,并绘制了一个 3D 图像。您可以旋转此图像并从任何角度查看它。

Figure 3
图 3. 表达式的 2D 图

Figure 4
图 4. 表达式的 3D 图

如果 Maxima 只能操作多项式,它仍然会是一个强大的工具。但是 Maxima 可以做更多的事情,我将在图 5 中尝试演示。在这里,在步骤 16 中,我要求 Maxima 使用双角定理展开一个三角表达式。即使我发现三角学是我上过的最简单的数学课,Maxima 也可以比我更好地操作三角恒等式。在步骤 17 中,我要求 Maxima 对 sin(3x) 关于 x 求导。这是一个相当简单的导数计算。我在步骤 18 中要求的导数一点也不简单。如果我们手动执行此计算,我们可能会使用乘积法则和商法则的组合,或者商法则的多个实例。然后我们必须简化结果。无论哪种方式,“呸”都是描述这个过程的好方法。Maxima 为我们提供了一个格式良好的答案。在步骤 19 中,我要求 Maxima 计算关于 x 的不定积分。我们在下一行看到了 Maxima 的答案。是的,这就是我想出来的;你呢?在步骤 20 中,我要求 Maxima 计算同一函数的定积分,x 从 0 到 5。当然,我可以要求数值格式的答案,但符号形式更Geeky。在步骤 21 中,我们看到 Maxima 可以应用洛必达法则来计算表达式在 x 趋于无穷大时的极限。

Figure 5
图 5. 更多 Maxima 操作

在步骤 22 中,我要求 Maxima 计算以 x=0 为中心的 sin(x) 泰勒级数的前几项。这就是我们开始看到 Maxima 弱点的地方。泰勒级数每一项的分母中都应该有一个阶乘。但是 Maxima 只是以数值形式给了我们答案。

Maxima 也能够操作矩阵和集合,尽管我在这里不打算演示任何这些功能。最后,Maxima 有一种内置的编程语言,尽管它不是您见过的最优雅的语言。我在图 6 中向您展示了一个简短的示例。在这里,我为 x 赋值一个初始值。然后我计算一个表达式的值 10 次,使用上一个结果作为 x 的下一个值。只有少数几个 x 的初始值可以使这个表达式重复出现。你能找到它们吗?

Figure 6
图 6. 内置编程语言

如您所见,Maxima 是一款非常复杂的分析工具,擅长解决代数、三角学、线性代数、微分学和积分学方面的问题。它还可以使用任意大且精确的数字进行计算。有了所有这些功能,您可能会忍不住问,为什么我们还需要再教数学,这正是本文的重点。尽管 Maxima 功能强大,但它并不理解您提出的任何问题;它只知道如何计算答案。教授和学习数学的价值在于理解概念和思维过程。使用像 Maxima 这样的工具的价值在于消除数学过程中的一些乏味。

加载 Disqus 评论