Н.И. Яцкин - Линейная алгебра (Теоремы и алгоритмы) (1109879), страница 91
Текст из файла (страница 91)
1Прил. 1#####Коды Maple-процедурнаходится его размерность и"экономное" представление первым способом(с помощью матриц JA1,JA2, JA0 соответственно).Дополнительно определяется размерность d3суммы W3=W1+W2.local n,n1,n2,alg,JA1,JA2,A0,JA0,B0,d1,d2,d3,d0,sys0;n1:=ColumnDimension(A1); n2:=ColumnDimension(A2);if n1<>n2 thenERROR(`Вводимые матрицы должны иметьравное количество столбцов!`);elsen:=n1;fi;# Контроль совпадения размерностей по столбцам# для данных матриц А1 и А2.# Размерность всего пространства: dim(V)=n.JA1:=algorithm_1(A1)[3];d1:=n-RowDimension(JA1);JA2:=algorithm_1(A2)[3];d2:=n-RowDimension(JA2);# Процедура algorithm_1 применяется# к каждой из данных матриц.# Определены (и записаны в матрицы JA1 и JA2)# виды Жордана – Гаусса для матриц A1 и A2.# Определены "экономные" задания первым способом# (с помощью матриц JA1 и JA2)# для данных подпространств W1 и W2,# а также размерности d1=dim(W1) и d2=dim(W2).A0:=<JA1,JA2>;# Вертикальная конкатенация матриц, задающих W1 и W2.# Пересечение W0 задается (первым способом)# как нуль-пространство матрицы A0.alg:=algorithm_1(A0);B0:=alg[1];d0:=alg[2];JA0:=alg[3];sys0:=alg[4];# Процедура algorithm_1 применяется# к матрице A0.# Определяется (и заносится в матрицу B0),# некоторый базис в пересечении W0;# вычисляется размерность d0=dim(W0);# находится матрица JA0, с помощью которой# осуществляется "экономное" задание# для W0 (первым способом).# Это задание представляется также# в виде однородной с.л.у.
sys0.d3:=d1+d2-d0;# Размерность суммы W3=W1+W2.537538Коды Maple-процедурRETURN(B0,d0,JA0,sys0,[JA1,d1],[JA2,d2],d3);# Возвращаются:# 1) матрица B0, содержащая базис в пересечении W0#данных подпространств W1 и W2;# 2) размерность d0=dim(W0);# 3) матрица JA0 полного ранга по строкам,#нуль-пространством которой является W0;# 4) соответствующая однородная с.л.у.
sys0#вида JA0 x= 0;# 5) список, содержащий матрицу JA1#полного ранга по строкам,#нуль-пространством которой является W1,#и размерность d1=dim(W1);# 6) аналогичный список [JA2,d2] для W2;# 7) размерность суммы d3=dim(W3).end proc;> save BiS,"F:/MaplePackages/BiS.m";# Сохранение пакета BiS.Прил. 1Прил. 1Коды Maple-процедур5392. Процедура-сценарий jrd(к ТР2 "Жорданов базис для линейного эндоморфизма"; п. 28.5)> restart;with(LinearAlgebra):interface(rtablesize=infinity):# Выбран интерфейс с возможностью вывода# матриц произвольного размера.> # MAPLE-сценарий:# ПРИВЕДЕНИЕ К (ЧАСТИЧНОЙ) ЖОРДАНОВОЙ НОРМАЛЬНОЙ ФОРМЕ# МАТРИЦЫ НАД ПОЛЕМ Q (ИЛИ НАД ПОЛЕМ Q[i])> jrd:=proc(A::'Matrix'(square))####Процедура применяется к квадратной матрице A.Работоспособна в случае рациональности ее элементов.(Отредактировав одну строку, можно получить версию,работающую над полем Q[i] гауссовых рациональных чисел.)local n,E,i,j,k,u,v,h,hf,hroots,s,lambda,m,ms,exist_jbas,B,BGJ,d,Nbas,F,l,p,q,DIAGR,RIS,jlist,num,JS,J,M,MG,blist,H,G,GS,GSE,GSEG,T,dt,str;str:=`---------------------------------------------------------------------------------`;####Процедура названа "сценарием",поскольку по ходу работына печать выводятся все существенныепромежуточные результаты.# В качестве "логического разделителя" этапов# используется строка из дефисов.# Размер матрицы.n:=RowDimension(A);print('n'=n);# Единичная матрица.E:=IdentityMatrix(n);540Коды Maple-процедур# Булевозначная переменная - индикатор# наличия/отсутствия полного жорданова базиса.exist_jbas:=true;# Характеристический многочлен.h:=CharacteristicPolynomial(A,lambda);print('h(lambda)'=h);# Характеристические корни (собственные значения)# и их алгебраические кратности;# разложение характеристического многочлена# на неприводимые множители.hroots:=roots(h);hf:=factor(h);# ВНИМАНИЕ! Для перехода к работе в поле Q[i]# строку выше можно "закомментировать"# и заменить на "раскомментированную" строку ниже:# hroots:=roots(h,I);hf:=factor(h,I));print('h(lambda)'=hf);# Отработка исключительной ситуации:# в случае пустоты спектра выдается сообщение об ошибке.if hroots=[] thenERROR(`Матрица имеет пустой спектр!`);fi;# Мощность спектра.s:=nops(hroots);print('s'=s);# Формирование массивов собственных значений# и соответствующих алгебраических кратностей.lambda:=array(1..s);m:=array(1..s);for i from 1 to s dolambda[i]:=hroots[i][1];m[i]:=hroots[i][2];print(evaln(lambda[i])=lambda[i],evaln(m[i])=m[i]);od;print(str);# Сумма алгебраических кратностей собственных значений.ms:=sum('m[j]',j=1..s);print(evaln(ms)=ms);# Тест на существование полного жорданова базиса.Прил.
1Прил. 1Коды Maple-процедурif ms<n thenexist_jbas:=false;print(`Не существует полного жорданова базиса,только - частичный.`);elseprint(`Полный жорданов базис существует.`);fi;print(str);# Заготовки для рабочих массивов B,BGJ,d,Nbas,F,l.# Элементы всех этих массивов (кроме последнего)# сами являются индексированными переменными.# Массив степеней матриц B[i]=A-lambda[i]*E:# B[i][k]=(A-lambda[i]*E)^k,# где i - номер собственного значения (i=1,...,s),# k - номер итерации (0<=k<=m[i]).B:=array(1..s);# Те же матрицы, приведенные к виду Жордана-Гаусса.BGJ:=array(1..s);# Массив итерированных дефектов: d[i][k]=dfc(B[i][k]);d:=array(1..s);# Массив базисов в итерированных ядрах:# множество Nbas[i][k] должно содержать# необработанный базис# в итерированном ядре N[i][k]=Ker(B[i][k]).Nbas:=array(1..s);# Массив фундаментальных матриц:# матрица F[i][k] формируется# из векторов множества Nbas[i][k].F:=array(1..s);# Массив показателей стабилизации:# l[i] - показатель стабилизации для матрицы B[i].l:=array(1..s);# Заполнение массивов B,BGJ,d,Nbas,F,l.for i from 1 to s do# Начальные значения для# индексированных переменных - элементов массивов B,d.B[i][0]:=E:d[i][0]:=0:# Начало вычисления показателей стабилизации.l[i]:=1:541542Коды Maple-процедурПрил.
1for k from 1 to m[i] do# Число итераций не превышает# алгебраической кратности m[i].# Вычисление итераций (степеней)# матрицы B[i]=B[i][1]=A-lambda[i]*E.B[i][k]:=B[i][k-1].(A-lambda[i]*E):# Приведение матриц B[i][k] к виду Жордана-Гаусса.BGJ[i][k]:=ReducedRowEchelonForm(B[i][k]):######Отыскание базиса в ядре N[i][k].(Функция NullSpace возвращаетбазис в этом ядре - как множество,которое в два этапа конвертируетсясначала - в список,затем - в фундаментальную матрицу.)Nbas[i][k]:=NullSpace(BGJ[i][k]):F[i][k]:=convert(convert(Nbas[i][k],list),Matrix):# Вычисление итерированных дефектов.d[i][k]:=n-Rank(B[i][k]);if d[i][k]<m[i] then# Итерации продолжаются до тех пор, пока# итерированный дефект остается меньшим,# чем алгебраическая кратность собственного значения.l[i]:=l[i]+1:elsebreak;# Выход из цикла по достижении стабилизации.fi;od:# Показатель стабилизации определен# и выдается на печать.print(evaln(l[i])=l[i]);# Печать промежуточных результатов# и, в частности, - необработанных базисов# в итерированных ядрах (в виде матриц F[i][k]).for k from 1 to l[i] doprint(evaln(B[i][k])=B[i][k],evaln(BGJ[i][k])=BGJ[i][k]);print(evaln(F[i][k])=F[i][k],evaln(d[i][k])=d[i][k]);print(str);od;print(str);od:Прил.
1Коды Maple-процедур# Заготовка для массива# приращений итерированных дефектов# (длин строк в столбчатой диаграмме).# Натуральное число p[i][k]# имеет смысл размерности# прямого дополнения C[i][k]# к (k-1)-му ядру N[i][k-1]# в k-м ядре N[i][k].p:=array(1..s):# Заполнение и печать массива p.for i from 1 to s dofor k from 1 to l[i] dop[i][k]:=d[i][k]-d[i][k-1]:print(evaln(p[i][k])=p[i][k]);od:print(str);od:print(str);####Заготовка для массиваабсолютных вторых приращенийитерированных дефектов(длин ступенек в столбчатой диаграмме).# Неотрицательное целое число q[i][k]# имеет смысл размерности# прямого дополнения D[i][k]# в подпространстве C[i][k]# к образу B[i](C[i][k+1])# подпространства C[i][k+1]# при отображении, заданном матрицей B[i].q:=array(1..s):# Заполнение массива q.for i from 1 to s do# Длина верхней ступеньки,# т.
е. dim(D[i][l[i]]).q[i][l[i]]:=p[i][l[i]]:# Длины остальных ступенек.# т. е. dim(D[i][k]), где 1<=k<l[i].for k from 1 to l[i]-1 doq[i][k]:=p[i][k]-p[i][k+1]:od:od:543544Коды Maple-процедур# Печать массива q.for i from 1 to s dofor k from 1 to l[i] doprint(evaln(q[i][k])=q[i][k]);od;print(str);od;print(str);####Задание массива DIAGR столбчатых диаграммдля матриц B[i].Элементами этого массива являютсяматрицы DIAGR[i] {i=1,...,s).#####Для их визуализации используютсяматрицы RIS[i] с противоположным порядком строк.(Это связано с тем, что строки в матриценумеруются сверху вниз,а в столбчатой диаграмме - наоборот.)# Сначала диаграммы даются без нумерации векторов# (заполняются звездочками),# а затем - с нумерацией по принципу:# столбцы нумеруются слева направо,# векторы в столбцах - снизу вверх.DIAGR:=array(1..s):RIS:=array(1..s);# Цикл по номеру собственного значения.for i from 1 to s do# Задание (заполненных "пустыми словами" ``)# матриц DIAGR[i],# каждая из которых содержит# l[i] (= показатель стабилизации) строк# и d[i][1] (= первый дефект) столбцов.DIAGR[i]:=Matrix(l[i],d[i][1],fill=``):# Заполнение звездочками тех позиций в DIAGR[i],# которые относятся к столбчатой диаграмме.# Цикл по номеру строки в матрице DIAGR[i].for k from 1 to l[i] do# Цикл по номеру столбца в DIAGR[i].for j from 1 to p[i][k] do# Звездочка в j-м столбце k-й строки матрицы# проставляется, если 1<=j<=p[i][k].DIAGR[i][k,j]:=`*`;od:od:Прил.