ВЕСТНИК ТГГПУ. 2011. №1(23)
УДК 512.5; 519.6;519.8; 372.851; 378.02
БИБЛИОТЕКА ПРОГРАММНЫХ ПРОЦЕДУР ДЛЯ МЕТОДИЧЕСКОГО ОБЕСПЕЧЕНИЯ КУРСА ВЫСШЕЙ АЛГЕБРЫ В СИСТЕМЕ КОМПЬЮТЕРНОЙ МАТЕМАТИКИ "MAPLE"
© Ю.Г.Игнатьев, А.Р.Самигуллина
В статье описана библиотека программных процедур для методического обеспечения курса высшей алгебры в пакете компьютерной математики "Maple".
Ключевые слова: линейная алгебра, системы компьютерной математики, алгоритмы, библиотеки программных процедур.
1. Введение
Учебный модуль высшей алгебры является составной и базовой частью курса высшей математики для нематематических факультетов. Основная цель этого модуля - изучение теории линейных алгебраических уравнений, необходимой как в других модулях курса высшей математики и предметах естественнонаучного цикла, так и имеющей самостоятельную ценность для решения многочисленных прикладных задач. Кроме того, в этот модуль включается изучение основ матричного исчисления и теории определителей, необходимых для изучения теории систем линейных алгебраических уравнений (СЛАУ), а также имеющих многочисленные приложения в других модулях курса высшей математики и, следовательно, обладающих самостоятельной ценностью. Поэтому информатизация этого модуля имеет большое значение для изучения курса высшей математики.
В работе А.Р.Самигуллиной были рассмотрены основные принципы математического и компьютерного моделирования объектов линейной алгебры и аналитической геометрии в системе компьютерной математики (СКМ) Maple [1]. В частности, в указанной работе была представлена программа автоматизированного решения системы линейных алгебраических уравнений в СКМ Maple с выводом решений в стандартной для Российской системы образования форме. Однако описанная программная процедура обладает существенным недостатком: при наличии нулевых коэффициентов перед неизвестными эти переменные не считываются и соответствующие нули не попадают в расширенную матрицу системы. Кроме того, встроенные программные процедуры Maple не содержат программы нахождения фундаментальных решений СЛАУ, имеющих большую ценность в многочисленных приложениях и составляющих основу математической культуры.
Решение указанных двух задач программными способами в СКМ Maple потребовало значительного усложнения программных процедур. Здесь следует отметить общее правило создания программных продуктов: чем менее профессиональным является пользователь программного продукта, тем большая степень программного сервиса требуется от этого продукта, а значит, и более сложные соответствующие программные процедуры. В данной статье мы укажем пути решения этих задач и опишем библиотеку соответствующих программных процедур Algebra .
2. Программные процедуры нахождения общего решения систем линейных алгебраических уравнений Рассмотрим систему алгебраических линейных уравнений из m уравнений относительно n неизвестных:
АХ = В = bk; (k = \m) (1)
i=1
где А - основная матрица системы, В - матрица-столбец свободных членов, X - матрица-столбец неизвестных:
( а ии а > U\n ( X: '
а , . V ml .. а mn у ; в = b m ; X = X ) n . (2)
Пользователь (студент-нематематик) вводит указанную систему в Maple не в матричной, а в стандартной форме упорядоченного списка уравнений:
Sys := [a1* x + a2 * y +----+ an * и = b1,
ß* x + ß2 * У + -" + ßn * и = Ьг, (3)
..., Д * x + S2* y + — + Sn * и = bm ], где ai,ß,...,St,bj - коэффициенты уравнений (1),
т.е. конкретные числа, а x,у,..., и - имена переменных, которые в конкретном задании могут быть произвольными. Поэтому первой задачей является компьютерное распознавание системы
(3) и приведение ее к стандартному виду (1), а также нахождение расширенной матрицы системы:
Í
A =
а,-
а,.
а,.
а , а 2
V ml m 2
а b
mn m J
\
(4)
2.1. Распознавание системы линейных алгебраических уравнений
Для распознавания системы (3) библиотека Algebra имеет программную процедуру Alge-bra[InfoEq], которая предоставляет информацию об одиночном линейном уравнении в виде упорядоченного списка, первый элемент которого есть упорядоченный список имен переменных уравнения, второй элемент - упорядоченный список коэффициентов при этих переменных, третий элемент - правую часть уравнения:
> Algebra[InfoEq]:=proc(Eq) local n,i,xxx: n:=Algebra[number_members](Eq):
xxx: =(i)->Algebra[coef_var] (Eq,i): [[seq(xxx(i)[2],i=1..n)],[seq(xxx(i)[1 ],i=1..n)], rhs(Eq)]:end proc:
Здесь использована процедура number coef которая находит коэффициент у i-той переменной, причем если коэффициент равен 1, т.е. множитель перед переменной отсутствует, то результат действия программы будет "1", в других ненулевых случаях результат равен "2": >Algebra[number_coef]: =(Eq,i)-> nops([op([op(lhs(Eq))])][i]):
Пример:
>Algebra[number_coef](3*x+2*y+z=23,3);
1
Покажем пример распознавания одиночного линейного алгебраического уравнения с помощью созданной процедуры
> Algebra[InfoEq](3*x+2*y+z=23);
[[x, y, z ], [3,2,1],23]
Далее, процедура associate находит объединение подмножеств х, представленных в виде неупорядоченного списка неупорядоченных списков:
x = {{a _1,...,a _ r},{b _1,b _2,...,b _ s},
..., {c _1,..., c _ m}.
При этом результат записывается в виде упо-рядочного списка:
> Algebra[associate]:=proc(x) local elem,u: u:=x[1]: for elem in x do u:=u union elem: end do :[op(u)]: end proc :
Пример:
> Algebra [associate]([{x,y,z},{y,u,z},{y,t,w}, {r,u,s}]);
[r, u, y, z, X, t, w, s ]
2.2. Приведение СЛАУ к стандартному виду
Процедура StandartSys выводит СЛАУ в стандартном виде с унифицированными именами переменных Х{, где i = 1...nnn:
>Algebra[StandartSys]:=proc(Eqs)local
nn,Eq,i,vars,Vars,
nnn,k,SB,EQS:
nn:=nops(Eqs):Eq:=(i)->Eqs[i]: vars:=(i)->{op(Algebra[InfoEqJ(Eq(i))[l ])}: Vars:=Algebra[associate]({seq(vars(i),i=l..nn)}
):
nnn:=nops(Vars):SB:={seq(Vars[k]=X[k],k=1..
nnn)}:
EQS:=subs(SB,Eqs):EQS:end proc:
Пример:
>Algebra[StandartSys]([x+2*y-z=5,x+y-3*z=7,5*x-3 *y+2*z=9,x+y+z=1 J);
[X1 + 2X2 - X3 = 5, X1 + X2 - 3X3 = 7,
5X1 - 3X2 + 2X3 = 9, X1 + X2 + X3 = 1].
2.3. Программа нахождения основной и расширенной матрицы системы
Процедура Algebra[MatrSys] создает упорядоченный список, состоящий из двух матриц -основной матрицы системы, A, и расширенной,
A:
>Algebra[MatrSys]:=proc(Eqs)local
nn,Eq,i,vars,
Vars,nnn,k,SB,EQS,aa,bb,AA,AB: nn:=nops(Eqs): Eq:=(i)->Eqs[iJ: vars:=(i)->{op(Algebra[InfoEq](Eq(i))[1 ])}: Vars:=Algebra[associate] ({seq(vars(i),i=1..nn)}): nnn:=nops(Vars):SB:={seq(Vars[k]=X[k],k=1.. nnn)}:
EQS:=subs(SB,Eqs):aa:=(i,k)->coeff(lhs(EQS[i]),X[kJ): bb:=(i)-
>rhs(EQS[i]):AA:=convert([seq([seq(aa(i,k), k=1..nnn)],i=1..nn)],Matrix):
AB:=convert([seq([seq(aa(i,k),k=1..nnn),bb(i)J, i=1..nn)],Matrix):[AA,AB]:end proc:
Пример:
> Algebra[MatrSys]([x+2*y-z=5, y-3*z=7,5*x-3*y+2*z=9]);
l 2 -l" "l 2 -l 5
0 l -3 ? 0 l -3 7
5 -3 2 5 -3 2 9
2.4. Программа нахождения общего решения в стандартном виде
Программная процедура Algebra[SolLinGen] находит общее решение системы линейных алгебраических уравнений, причем значению параметра t=matr соответствует вывод решения системы в матричном виде, в котором произвольные константы выводятся в формате St, где i - номер строки, содержащей только эту константу с коэффициентом 1. В случае если система не совместна, то вместо решения команда выводит сообщение о несовместности. При любом другом значении параметра t , например, 123, -решение выводится в списочном виде: x=x1,
у=у1,---:
> Algebra[SolLinGen]:=proc(Eqs,t) local nn,Eq,i,vars,Vars,nnn,k,SB,
EQS,aa,bb,AA,AB,r1,r2,BB,SSS,C,RRR:
nn:=nops(Eqs):Eq:=(i)->Eqs[i]:
vars:=(i)->{op(Algebra[InfoEq](Eq(i))[1])}:
Vars:=Algebra[associate]({seq(vars(i),i=1..nn)}):
nnn:=nops(Vars):SB:={seq(Vars[k]=X[k],k=1..
nnn)}:
EQS:=subs(SB,Eqs):aa:=(i,k)->coeff(lhs(EQS[i]),X[k]): bb:=(i)-
>rhs(EQS[i]):AA:=convert([seq([seq(aa(i,k), k=1..nnn)], i=1..nn)],Matrix):
AB:=convert([seq([seq(aa(i,k),k=1..nnn),bb(i)], i=1..nn)],Matrix):BB:=Vector([seq(bb(i),i=1..nn)]): r1:=linalg[rank](A^):r2:=linalg[rank](AB): if r1=r2 then
SSS:=LinearAlgebra[LinearSolve] (AA, BB,free= 'S'):
RRR:=seq(Vars[i] =SSS[i],i=1..nnn): else ("Система не совместна”) end if: if t=matr then SB,convert(SSS,Matrix): else RRR: end if: end proc:
Пример 1:
> Eq1:=[x+2*y-z=5, x+y-3*z=7,5*x-3*y+2*z=9,y+2*z=-2]:
> Algebra[SolLinGen](Eq1,a);
29
-14
x = —, y = —, z =---.
11 11 11
Пример 2:
> Eq2:=[x-3 *y+10*z-t+u=1,x+y+3*z-t-u=3,x-2*y+2*t+2*u=1]:
> SSEq2:=Algebra[SolLinGen](Eq2,matr);
SSEq2:= {x = Xx, y = X2,
z = x3, u = X 4, t = X J,
7 - 2S,
S
-1 - 2S5 +—S3 3 5 2 3
(5)
S
3. Программные процедуры нахождения фундаментального решения систем линейных алгебраических уравнений
Полученное общее решение в форме (5) дает возможность найти фундаментальное решение СЛАУ. Для того чтобы воспользоваться этим решением, необходимо, во-первых, найти в матрице типа (5) все произвольные константы Si, во-вторых, определить их номера положения в матрице - столбце, в-третьих, образовать последовательности решений Zi, полученных из общего решения вида (5) подстановкой: Sk =5'к. Для достижения этого результата в библиотеке Algebra имеются две команды: Finder и ListNum. Команда Finder(s,a) отыскивает элемент a в списке s и определяет его положение; в случае, если элемент a не содержится в списке s, команда выводит пустой список.
> Algebra[Finder]: = proc(s,a) local ss,i,j,aa: aa:=convert(a,symbol):
ss:=[]:
for i from 1 to LinearAlgebra[RowDimension](s)
do
for j from 1 to LinearAlge-bra[ColumnDimension](s) do
if(convert(s[i,j],symbol)=aa) then ss:=[op(ss),[i,j]]: end if: end do: end do: ss: end proc :
Пример:
> Algebra[Finder](SSEq2Matr,S[5]);
[[5,1]]
> Algebra[Finder](SSEq2Matr,S[3]);
[[3,1]]
> Algebra[Finder](SSEq2Matr,S[6]);
[],
где SSEq2Matr - матрица в правой части (5). Далее, процедура ListNum определяет положение элементов в матрице-столбце и записывает это положение в виде упорядоченного списка:
> Algebra[List_Num]:=proc(A) local i,ss,nn: nn:=nops(A):ss:=[]:
for i from 1 to nn do
if A[i]=1 then ss:=[op(ss),i]:end if:
end do : ss: end proc :
Наконец, процедура Algebra[SolLinBasic] выводит фундаментальное решение в виде матрицы, каждый столбец которой представляет линейно независимое решение:
>Algebra[SolLinBasic]:=proc(Eqs) local nn,Eq,i,vars,Vars,
nnn,k,SB,EQS,aa, bb,AA,AB,r1,r2,BB,SSS,S,RRR,SSS M, nFC,NC,mmm,j,ii,FSJ,FS:nn:=nops(Eqs): Eq:=(i)->Eqs[i]:
vars:=(i)->{op(Algebra[InfoEq](Eq(i))[1])}: Vars:=Algebra[associate] ({seq(vars(i),i=1..nn)}): nnn:=nops(Vars): SB:={seq(Vars[k]=X[k],k=1..nnn)}: EQS:=subs(SB,Eqs): aa:=(i,k)->coeff(lhs(EQS[i]),X[k]): bb:=(i)->rhs(EQS[i]): AA:=convert([seq([seq(aa(i,k), k=1..nnn)],i=1..nn)],Matrix): AB:=convert([seq([seq(aa(i,k),k=1..nnn),bb(i)],i =1..nn)],Matrix):BB:=Vector([seq(bb(i),i=1..nn)]): r1:=linalg[rank](AA):r2:=linalg[rank](AB): if r1=r2 then
SSS:=LinearAlgebra[LinearSolve] (AA, BB,free= 'S'):
SSSM:=convert(SSS,Matrix):
nFC:=[seq(nops(Algebra[Finder](SSSM,S[i])),i
=1..nnn)]:
NC:=Algebra[List_Num](nFC):mmm:=nops(N C): ii:=(j)->NC[j]:
FSJ:=(j)-
>subs({seq(S[ii(k)]=delta(k,j),k=1..mmm)},SSSM): FS:=convert([seq(FSJ(j),j=1..mmm)],Matrix): else ("Система не совместна”):end if: FS: end proc:
Пример применения процедуры мы не приводим из-за громоздкости ответа. Для вывода фундаментального решения в стандартном для вузов списочном виде библиотека Algebm содержит специальную процедуру Alge-bra[SolLinBasics]:
> Algebra[SolLinBasics]: =proc(Eqs)local mmm,nnn,i,k,SSSS:
SSSS:=Algebra[SolLinBasic](Eqs): mmm:=LinearAlgebra[RowDimension](SSSS): nnn:=LinearAlgebra[ColumnDimension](SSSS): [seq([seq(SSSS[i,k],i=1..mmm)],k=1..nnn)]: end proc :
Пример:
Рассмотрим систему уравнений Eq3: >Eq3:=[x+2*y-3*z+u-6*t+8*n=1,x-y+2*z-t-n=0,2*x+y-z+3*u-t=1 ]:
Ее фундаментальное решение в стандартном, списочном виде дается командой:
> Algebra[SolLinBasics](Eq3);
[0, 2,1,0, 0,0],
-17 -2З
0,1,-,0
6 6 [4,3, 0,0, - 3,1]]
Заключение
Созданная библиотека процедур приспособлена для студентов нематематических факультетов, удобна и проста в работе. Она может быть использована и преподавателями для проверки работ студентов, а также для генерации заданий.
1. Самигуллина А.Р. Математическое моделирование объектов линейной алгебры и аналитической геометрии в системе компьютерной математики Maple // Вестник ТГГПУ. - 2010. - №3(21). -С.69-74.
THE LIBRARY OF PROGRAMME PROCEDURES FOR METHODICAL SUPPORT OF LINEAR ALGEBRA COURSE IN A COMPUTER MATHEMATICS SYSTEM "MAPLE"
Yu.G.Ignatyev, A.R.Samigullina
The library of programme procedures for methodical support of Linear Algebra course in a computer Mathematics system "Maple" is described.
Key words: Linear Algebra, computers Mathematic systems, algorithm, libraries of programme procedures.
Игнатьев Юрий Геннадиевич - доктор физико-математических наук, профессор, заведующий кафедрой геометрии и математического моделирования Татарского государственного гуманитарно-педагогического университета.
E-mail: ignatev_yu@rambler.ru
Самигуллина Алсу Ринатовна - аспирант кафедры геометрии и математического моделирования Татарского государственного гуманитарно-педагогического университета.
E-mail: alsu_sam@mail.ru
Поступила в редакцию 21.12.2010