Н.И. Яцкин - Линейная алгебра (Теоремы и алгоритмы) (1109879), страница 92
Текст из файла (страница 92)
1Прил. 1Коды Maple-процедур# Задание матриц RIS[i]# (имеющих лишь иллюстративное назначение).# ВНИМАНИЕ! Строки в матрицах RIS[i] и DIAGR[i]# нумеруются в противоположном направлении:# k-я строка в матрице RIS[i] соответствет# (l[i]-k+1)-й строке в матрице DIAGR[i].RIS[i]:=Matrix(l[i],d[i][1]):for j from 1 to d[i][1] dofor k from 1 to l[i] doRIS[i][k,j]:=DIAGR[i][l[i]-k+1,j];od;od;od:# Печать "полуфабрикатов" столбчатых диаграмм.for i from 1 to s doprint(evaln(DIAGR[i])=RIS[i]);od;print(str);# Сквозная нумерация ячеек столбчатых диаграмм.num:=0:# Цикл по номеру собственного значения.for i from 1 to s do# Обновление матрицы DIAGR[i].# Цикл по номеру столбца в DIAGR[i].for j from 1 to d[i][1] do# Цикл по номеру строки в DIAGR[i].for k from 1 to l[i] do #to 1 by -1 doif DIAGR[i][k,j]=`*` then# Каждая позиция, занятая *,# увеличивает номер num на единицу.# (Именно в эту позицию проставляется# полученное значение num.)num:=num+1:DIAGR[i][k,j]:=num:elsebreak:fi:od:od:545546Коды Maple-процедур# Обновление матрицы RIS[i].for j from 1 to d[i][1] dofor k from 1 to l[i] doRIS[i][k,j]:=DIAGR[i][l[i]-k+1,j];od;od;od:# Печать обновленных вариантов столбчатых диаграмм# (со сквозной нумерацией ячеек).for i from 1 to s doprint(evaln(DIAGR[i])=RIS[i]);od;print(str);print(str);#######Формирование списка jlistпар вида [lambda[i],k],где lambda[i] - собственное значение,k - высота столбцав соответствующей столбчатой диаграмме,в порядке убывания высот(т.
е. продвигаясь слева направо по диаграмме).# Изначально список jlist пуст.jlist:=[];# Цикл по номеру собственного значения.for i from 1 to s do# Цикл по номеру столбца в DIAGR[i].for k from l[i] to 1 by -1 do# Если зона столбцов высоты k не пуста,# то к списку jlist добавляется# q[i][k] одинаковых пар [lambda[i],k].if q[i][k]<>0 thenfor j from 1 to q[i][k] dojlist:=[jlist[],[lambda[i],k]];od:fi:od:od:########Формирование матрицы JS жордановой нормальной формы матрицы A (порядка n)или - частичного жорданова блока (порядка ms) как блочно-диагональной матрицы,с блоками - жордановыми ящиками,причем каждой паре [lambda[i],k]отвечает жорданов ящик J[k](lambda[i])k-го порядка с lambda[i] на диагонали.Прил. 1Прил.
1Коды Maple-процедур547JS:=JordanBlockMatrix(jlist);print(evaln(JS)=JS);print(str);print(str);#####Задание рабочих массивов H,G,M.Каждый элемент каждого из этих массивовсам является индексированной переменной,причем при каждом значении индекса kэта переменная является матрицей.# Заготовка для массива матриц H[i][k], содержащих# базисы в подпространствах D[i][k],# отвечающих ступенькам столбчатой диаграммы.H:=array(1..s);# Заготовка для массива матриц G[i][k], содержащих# базисы в подпространствах C[i][k],# отвечающих строкам столбчатой диаграммы.G:=array(1..s);# Заготовка для массива вспомогательных# матриц-конкатенаций M[i][k].M:=array(1..s);# Те же матрицы, приведенные к ступенчатому виду.MG:=array(1..s);# Цикл по номеру собственного значения.for i from 1 to s doif l[i]=1 then# Отработка случая, когда# показатель стабилизации l[i]=1# (т.
е. столбчатая диаграмма является "одноэтажной"# и, следовательно, соответствующее# корневое подпространство# совпадает с собственным).# Здесь обработка базиса, содержащегося# в фундаментальной матрице F[i][1], не требуется.H[i][1]:=F[i][1];G[i][1]:=H[i][1];print(evaln(H[i][1])=H[i][l[i]],evaln(G[i][1])=G[i][l[i]]);print(str);else# Случай, когда число этажей l[i]>1.for k from l[i] to 1 by -1 do# Спуск по этажам столбчатой диаграммы.548Коды Maple-процедур####Прил.
1Рассматриваются три случая расположения этажа:1) верхний этаж;2) промежуточные этажи;3) нижний этаж.if k:=l[i] then# Определение векторов верхнего этажа# столбчатой диаграммы.# Формирование матрицы-конкатенации,# содержащей базисы# в предстабильном и в стабильном ядрах,# приведение этой матрицы# к ступенчатому виду# и печать результатов.M[i][k]:=<F[i][k-1]|F[i][k]>;MG[i][k]:=GaussianElimination(M[i][k]);print(evaln(M[i][k])=M[i][k],evaln(MG[i][k])=MG[i][k]);######Формирование списка blistномеров добавочных базисных векторов,из правой зоны матрицы M[i][k],дополняющих базис в предстабильном ядре N[i][l[i]-1]до базиса в стабильном ядре N[i][l[i]](корневом подпространстве, отвечающем lambda[i]).# Изначально этот список пуст.blist:=[];# Номер первого столбца во второй зоне# матрицы-конкатенации M[i][k] (где k=l[i]).v:=d[i][k-1]+1;# Цикл по номеру строки в ступенчатой матрице MG[i][k],# начиная с первой строки, являющейся# чисто нулевой в первой (левой) зоне конкатенации,# и заканчивая последней ненулевой строкой# во всей матрице.for u from d[i][k-1]+1 to d[i][k] do# Просматриваем (слева направо) строку с номером u,# пока не встретим первый ненулевой элемент.# (При этом работает счетчик столбцов.)while MG[i][k][u,v]=0 dov:=v+1;od;# Встретив в строке с номером u,# в столбце с номером v# первый ненулевой элемент,# мы добавляем номер v к списку blist# и переходим к следующей строке.Прил.
1Коды Maple-процедурblist:=[blist[],v];od;#########Формируем матрицу H[i][k], отвечающуюступеньке уровня k=l[i](т. е. содержащую базис в D[i][k])как подматрицу в исходной конкатенации M[i][k],содержащую столбцы, номера которыхвходят в список blist.Формируем также матрицу G[i][k], отвечающуювсему рассматриваемому уровню(т. е. содержащую базис в C[i][k]).# (Для верхнего уровня эти матрицы совпадают.)H[i][k]:=SubMatrix(M[i][k],1..n,blist);G[i][k]:=H[i][k];# Выдаем на печать полученные результаты.print(evaln(H[i][k])=H[i][k],evaln(G[i][k])=G[i][k]);print(str);elif k<l[i] and k>1 then# Определение векторов на этажах,# начиная с предпоследнего и заканчивая вторым.if q[i][k]=0 then# Отработка случая, когда на k-м уровне# отсутствует ступенька.# В этом случае матрица H[i][k],# отвечающая ступеньке, - пуста,# а матрица G[i][k], отвечающая всему уровню,# находится умножением слева на матрицу B[i]# матрицы G[i][k+1], отвечаюшей# предыдущему (расположенному выше) уровню.G[i][k]:=B[i][1].G[i][k+1];# Выдаем на печать полученные результаты.print(evaln(H[i][k])=[],evaln(G[i][k])=G[i][k]);print(str);else# Случай, когда на k-м уровне есть ступенька.# Формирование "тройной" конкатенации M[i][k]:# в левой зоне - матрица, содержащая# (необработанный) базис в ядре N[i][k-1],# в центральной зоне - матрица, содержащая# образ B[i].G[i][k+1] базиса# в подпространстве C[i][k+1]# при отображении, заданном матрицей B[i],# в правой зоне - матрица, содержащая# (необработанный) базис в ядре N[i]{k].M[i][k]:=<F[i][k-1]|B[i][1].G[i][k+1]|F[i][k]>;549550Коды Maple-процедурПрил.
1# Приведение к ступенчатому виду матрицы M[i][k]# и печать полученных результатов.MG[i][k]:=GaussianElimination(M[i][k]);print(evaln(M[i][k])=M[i][k],evaln(MG[i][k])=MG[i][k]);# Формирование списка blist# номеров добавочных базисных векторов,# из третьей (правой) зоны матрицы M[i][k],# дополняющих до базиса в k-м ядре N[i][k]# базис в прямой сумме# (k-1)-го ядра N[i][k-1]# и образа B[i](C[i][k+1]).# Изначально этот список пуст.blist:=[];# Номер первого столбца в третьей зоне# матрицы-конкатенации M[i][k].v:=d[i][k-1]+p[i][k+1]+1;# Цикл по номеру строки# в ступенчатой матрице MG[i][k],# начиная с первой строки, являющейся# чисто нулевой в первых двух зонах конкатенации,# и заканчивая последней ненулевой строкой# во всей матрице.for u from d[i][k-1]+p[i][k+1]+1 to d[i][k] do# Просматриваем (слева направо) строку с номером u,# пока не встретим первый ненулевой элемент.# (При этом работает счетчик столбцов.)while MG[i][k][u,v]=0 dov:=v+1;od;# Встретив в строке с номером u,# в столбце с номером v# первый ненулевой элемент,# мы добавляем номер v к списку blist# и переходим к следующей строке.blist:=[blist[],v];od;# Формируем матрицу H[i][k], отвечающую# ступеньке уровня k# (т.
е. содержащую базис в D[i][k])# как подматрицу в исходной конкатенации M[i][k],# содержащую столбцы, номера которых# входят в список blist.H[i][k]:=SubMatrix(M[i][k],1..n,blist);# Формируем матрицу G[i][k], отвечающую# всему k-му уровнюПрил. 1Коды Maple-процедур551# (т. е. содержащую базис в C[i][k]).G[i][k]:=<B[i][1].G[i][k+1]|H[i][k]>;# Выдаем на печать полученные результаты.print(evaln(H[i][k])=H[i][k],evaln(G[i][k])=G[i][k]);print(str);fi;else;# Определение векторов первого этажа# столбчатой диаграммы.if q[i][k]=0 then# Отработка случая, когда на первом уровне# отсутствует ступенька.# В этом случае матрица H[i][1],# отвечающая ступеньке, - пуста,# а матрица G[i][1], отвечающая всему первому уровню,# находится умножением слева на матрицу B[i]# матрицы G[i][2], отвечаюшей# второму уровню.G[i][k]:=B[i][1].G[i][k+1];# Выводим на печать полученные результаты.print(evaln(H[i][k])=[],evaln(G[i][k])=G[i][k]);print(str);else# Случай, когда на первом уровне есть ступенька.# Формирование матрицы-конкатенации M[i][1]:# в левой зоне - матрица, содержащая# образ B[i].G[i][2] базиса# в подпространстве C[i][2]# при отображении, заданном матрицей B[i],# в правой зоне - матрица, содержащая# (необработанный) базис в первом ядре N[i][1].M[i][k]:=<B[i][1].G[i][k+1]|F[i][k]>;# Приведение к ступенчатому виду матрицы M[i][1]# и печать полученных результатов.MG[i][k]:=GaussianElimination(M[i][k]);print(evaln(M[i][k])=M[i][k],evaln(MG[i][k])=MG[i][k]);#####Формирование списка blistномеров добавочных базисных векторов,из второй (правой) зоны матрицы M[i][1],дополняющих до базиса в первом ядре N[i][1]базис в образе B[i](C[i][2]).552Коды Maple-процедурПрил.
1# Изначально этот список пуст.blist:=[];# Номер первого столбца во второй зоне# матрицы-конкатенации M[i][1].v:=p[i][k+1]+1;# Цикл по номеру строки# в ступенчатой матрице MG[i][1],# начиная с первой строки, являющейся# чисто нулевой в первой зоне конкатенации,# и заканчивая последней ненулевой строкой# во всей матрице.for u from p[i][k+1]+1 to d[i][k] do# Просматриваем (слева направо) строку с номером u,# пока не встретим первый ненулевой элемент.# (При этом работает счетчик столбцов.)while MG[i][k][u,v]=0 dov:=v+1;od;# Встретив в строке с номером u,# в столбце с номером v# первый ненулевой элемент,# мы добавляем номер v к списку blist# и переходим к следующей строке.blist:=[blist[],v];od;# Формируем матрицу H[i][1], отвечающую# ступеньке уровня k=1# (т.