1. 引言
应用数学软件辅助大学数学教学越来越为广大师生接受、喜爱 [1] [2] [3] [4] [5],其中数学软件Maple在计算、过程演示等方面具有强大的符号计算和图像功能,可以帮助我们快速、高效地解决诸如矩阵运算、求解线性方程组、计算特征值 [3] 和计算特征向量、逆矩阵、线性方程组解题过程可视化等问题 [4]。既减轻了教师制作课件的负担,也帮助学生理解基本概念、掌握基本运算方法,激发学生的学习兴趣。Maple不仅仅具有上述功能,它还是一款程序语言,通过编程实现体现教学过程、数学思维的模式化解题过程,克服了直接借助命令得到结果而没有思维过程的不足,也节省了教师制作教学资源的时间。随着数学教学改革的不断展开和教学平台的广泛应用,课后学生自学、复习、练习的教学资源建设也越发重要了,模式化是提高教学和试题建设效率的重要方法。本文主要用实例介绍Maple编程在解线性方程组的教学资源库建设中的应用。
2. Maple求解线性方程组的概述
线性方程组的系数矩阵、增广矩阵、秩、通解的计算方法都可以在Maple的工具包LinearAlgebra中实现,即在Maple输入with (LinearAlgebra),然后把线性方程组输入,然后利用函数GenerateMatrix、Rank、solve可以快速列出系数矩阵、增广矩阵、秩、通解。
2.1. 定义线性方程组
定义线性方程组用[ ]把多个方程括号起来,例如输入
sys:=[x[1]+x[2]-3x[3]-x[4]=1,3x[1]-x[2]-3x[3]+4x[4]=4,x[1]+5x[2]-9x[3]-8x[4]=0]
则所定义线性方程组sys为
。
2.2. 线性方程组相关概念的运算方法
2.2.1. 未知数var、系数矩阵A与增广矩阵M
输入
var:=[x[1],x[2],x[3],x[4]]
M:=GenerateMatrix(sys,var,augmented=true)
A:=M[1..-1,1..-2]
则相应的结果为
2.2.2. 矩阵的秩用Rank()函数
输入
R:=Rank(A)
r:=Rank(M)
则相应的结果为2,2。
2.3. 通解用solve()函数
输入
solve(sys,{seq(x[i],i=1..4)})
则相应的结果为
3. Maple描述线性方程组解题过程的程序设计
通过调用Maple的上述函数,我们可以快速得到相应的计算结果,但看不到计算过程和数学思维过程,这不利于实现培养学生数学逻辑思维能力,分析和解决实际问题能力形成。因此,我们有必要利用Maple编程将数学解题过程显示出来,既直观地展示线性方程组解题思想脉络,帮助学生消化理解,又可为促进学生逻辑思维能力和分析问题解决实际问题能力形成助力。下面给出展示求解线性方程组三种解(无解、有唯一解、有无穷多解)的情况的全过程程序。
3.1. 直接调用maple命令计算方程个数、秩等概念
3.1.1. 用常规命令m:=nops(sys):
R:=Rank(A):
r:=Rank(M):
jw:=n-r:
X:=BackwardSubstitute(U,free=t):
eta:=subs(seq(t[i]=0,i=1..jw),X):
X1:=NullSpace(A):
xi:=seq(X1[i],i=1..n-r):
X0:=add(k[i] matrix(n,1,convert(X1[i],list)),i=1..jw):
分别计算线性方程组的方程个数、系数矩阵的秩、增广矩阵的秩、基础解系的向量个数、方程组的解、特解、基础解系、齐次线性方程的通解等。
3.1.2. 用常规命令var:=[seq(x[i],i=1..n)]: M:=GenerateMatrix(sys,var,augmented=true):
A:=M[1..-1,1..-2]:
b:=M[1..-1,-1]:
U:=ReducedRowEchelonForm(M):
var1:={seq(var[i],i=1..n)} minus {seq(lhs(r1[i]),i=1..r)}:
var1a:=
:
tj0:=seq(var1[i]=0,i=1..jw):
分别定义未知数、增广矩阵、系数矩阵、常数列、行最简形、自由未知量、特解条件等。
3.2. 通过编程计算未知数个数、等价方程组等概念
3.2.1. 通过编程计算出线性方程组的未知数个数
wzs:=proc(m)
local i,total;
total:=0;
for i from 1 to m do
total:=total+100^i op(sys[i])[1] end do
end proc:
n:=nops([op(wzs(m))]):
3.2.2. 通过编程写出方程组的等价方程组及等价方程组对应的齐次方程组
zb:=U[1..r,1..n].Matrix(n,1,[seq(x[i],i=1..n)]):# 等价方程组左边
zb1:=convert(zb,list):
yb:=U[1..r,n+1]^%T:# 等价方程组右边
for i from 1 to r do
if nops(zb1[i])=1
then r1[i]:=(zb1[i]=yb[i])
else r1[i]:=(op(solve(zb1[i]=yb[i],{op(zb1[i])[1]})))
end if
end do:
sys1:={seq(r1[i],i=1..r)}:# 等价方程组
for i from 1 to r do
if nops(zb1[i])=1 then r0[i]:=(zb1[i]=0)
else ro[i]:=(op(solve(zb1[i]=0,{op(zb1[i])[1]})))
end if
end do:
sys0:={seq(r0[i],i=1..r)}:# 等价方程组对应的齐次方程组
3.2.3. 通过编程来写出基础解系条件
JC:=Matrix(jw,shape=identity):
if jw>1 then TJ:=seq(var1a=JC[1..jw,jw-i],i=0..jw-1)
else TJ:=var1a[1]=1:
end if :
3.2.4. 通过编程来实现输出解题过程
用WZ1:=(解对方程组的增广矩阵),WZ2:=(作初等行变换后得其行最简形)等等定义解题过程中的文字;用if..then..elif..then..else..end if编程实现三种解题过程输出。
通过上述编程,可以轻松实现线性方程组解题全过程显示,并按照线性方程组解的三种形式(无解、有唯一解、有无穷多解)的常见解题格式输出。求解线性方程组时,只要在该程序工作表上录入线性方程组,并执行整个工作表,只需10秒左右就可得到完整的解题过程。
4. 应用实例
4.1. 程序
restart:with(LinearAlgebra):
sys:=[x[1]+x[2]-3x[3]-x[4]=1,3x[1]-x[2]-3x[3]+4x[4]=4,x[1]+5x[2]-9x[3]-8x[4]=0]:
m:=nops(sys):
wzs:=proc(m)
local i,total;
total:=0;
for i from 1 to m do
total:=total+100^i op(sys[i])[1]
end do
end proc:
n:=nops([op(wzs(m))]):
var:=[seq(x[i],i=1..n)]:
M:=GenerateMatrix(sys,var,augmented=true):
A:=M[1..-1,1..-2]:
b:=M[1..-1,-1]:
U:=ReducedRowEchelonForm(M):
R:=Rank(A):
r:=Rank(M):
jw:=n-r:
X:=BackwardSubstitute(U,free=t):
eta:=subs(seq(t[i]=0,i=1..jw),X):
X1:=NullSpace(A):
xi:=seq(X1[i],i=1..n-r):
X0:=add(k[i] matrix(n,1,convert(X1[i],list)),i=1..jw):
C:=seq(k[i],i=1..jw):
zb:=U[1..r,1..n].Matrix(n,1,[seq(x[i],i=1..n)]):# 等价方程组左边
zb1:=convert(zb,list):
yb:=U[1..r,n+1]^%T:# 等价方程组右边
for i from 1 to r do
if nops(zb1[i])=1
then r1[i]:=(zb1[i]=yb[i])
else r1[i]:=(op(solve(zb1[i]=yb[i],{op(zb1[i])[1]})))
end if
end do:
sys1:={seq(r1[i],i=1..r)}:# 等价方程组
if R=r=n then WYJ:=zb=U[1..r,n+1]:end if:
for i from 1 to r do
if nops(zb1[i])=1
then r0[i]:=(zb1[i]=0)
else r0[i]:=(op(solve(zb1[i]=0,{op(zb1[i])[1]})))
end if
end do:
sys0:={seq(r0[i],i=1..r)}:# 等价方程组对应的齐次方程组
var1:={seq(var[i],i=1..n)} minus {seq(lhs(r1[i]),i=1..r)}:
var1a:=
:
tj0:=seq(var1[i]=0,i=1..jw):
TJ0:=var1a=
:
JC:=Matrix(jw,shape=identity):
if jw>1 then TJ:=seq(var1a=JC[1..jw,jw-i],i=0..jw-1)
else TJ:=var1a[1]=1:
end if :
WZ1:=(解对方程组的增广矩阵):
WZ2:=(作初等行变换后得其行最简形):
WZ20:=(所以系数矩阵和增广矩阵的秩):
WZ21:=(增广矩阵的秩):
WZ22:=(因此方程组无解):
WZ23:=(因此方程组有唯一解):
WZ3:=(所以原方程组等价于方程组):
WZ4:=(令):
WZ5:=(得特解):
WZ6:=(把):
WZ7:=(分别代入等价方程组对应的齐次方程组):
WZ8:=(得基础解系):
WZ9:=(则方程组的通解为):
WZ10:=(其中):
WZ11:=(为任意常数) :#解题过程中文字表述
if R
lprint(WZ3),print(sys1), lprint(WZ22)
elif R=r=n then lprint(WZ1),print(‘M’=M), lprint(WZ2),print(‘U’=U), lprint(WZ20),print(‘R’=R, ‘r’=r),
lprint(WZ3),print(sys1), lprint(WZ23), print(WYJ)
else lprint(WZ1),print(‘M’=M), lprint(WZ2),print(‘U’=U), lprint(WZ20),print(‘R’=R, ‘r’=r),
lprint(WZ3), print(sys1), lprint(WZ4), print(tj0), lprint(WZ5), print(‘η’=η), lprint(WZ6), print(TJ), lprint(WZ7), print(sys0), lprint(WZ8),print(ξ), lprint(WZ9),print(
‘X’=X0+eta), lprint(WZ10),print(C), lprint(WZ11)
end if
#按三种模式输出解题过程
4.2. 三种解题模式
4.2.1. 线性方程组无解模式
例1:解方程组
在《自动求解线性方程组》Maple工作表中录入线性方程组
sys:=[2x[1]-3x[2]+x[3]-2x[4]=2,x[1]-x[3]+2x[4]=2,3x[1]+2x[2]+x[3]=-1,-x[1]+2x[2]-x[3]+2x[4]=-4]:
并执行整个工作表得到
解:
对方程组的增广矩阵
,
作初等行变换后得其行最简形
所以系数矩阵和增广矩阵的秩
原方程组等价于方程组
,因此方程组无解。
4.2.2. 唯一解模式
例2:求方程组
的解。
在《自动求解线性方程组》Maple工作表中录入线性方程组
sys:=[2x[1]+x[2]-5x[3]+x[4]=8,x[1]-3x[2]-6x[4]=9,2x[2]-x[3]+2x[4]=-5,x[1]+4x[2]-7x[3]+6x[4]=0]:
并执行整个工作表得到
解:
对方程组的增广矩阵
,作初等行变换后得其行最简形
所以系数矩阵和增广矩阵的秩
原方程组等价于方程组
,所以方程组有唯一解
。
4.2.3. 有无穷多解模式
例3:求方程组
的通解。
在《自动求解线性方程组》Maple工作表中录入线性方程组
sys:=[x[1]+2x[2]-x[3]+3x[4]+x[5]=2,2x[1]+4x[2]-2x[3]+6x[4]+3x[5]=6,-x[1]-2x[2]+x[3]-x[4]+3x[5]=4]:
并执行整个工作表得到
解:
对方程组的增广矩阵
,
作初等行变换后得其行最简形
所以原方程组等价于方程组
。
令
得特解
,把
,分别代入等价方程组对应的齐次方程组
得基础解系
,则方程组的通解为
其中
为任意常数。
5. 结语
Maple软件为大学数学提供了直接调用的功能强大的函数,并借助这些函数编程写出模式化的解题过程,只需输入线性方程组就能快速得到该题的整个解题过程,既避免了计算繁杂而易错的问题,还大大节省了教师编写解题过程的时间,提高了数学资源库建设的效率。
基金项目
广东省数学会高职高专教师教育科研项目“高职数学移动学习资源开发与利用”(GDGZSX2019008)。