Линейная алгебра. Теоремы и алгоритмы. Яцкин Н.И. - 555 стр.

UptoLike

Составители: 

Прил. 1 Коды Maple-процедур 555
else
# Если полного жорданова базиса
# не существует,
# то мы дополняем жорданов базис в корневой сумме,
# содержащийся в матрице GS,
# до (частично жорданова) базиса
# во всем пространстве.
# Составляем и приводим к ступенчатому виду
# матрицу GSE, являющуюся конкатенацией
# матрицы GS и единичной матрицы E.
GSE:=<GS|E>;
GSEG:=GaussianElimination(GSE);
print(evaln(GSE)=GSE);
print(evaln(GSEG)=GSEG);
# Выбираем (по ступенькам в правой
зоне
# матрицы GSEG) добавочные векторы
# из правой зоны матрицы GSE
# и приписываем их к GS.
for i from ms+1 to n do
for j from ms+1 to n do
if GSEG[i,j]<>0 then
T:=<T|SubMatrix(GSE,1..n,j..j)>;
break;
fi;
od;
od;
# В итоге формируется квадратная
# матрица T размера n на n,
# содержащая частично жорданов базис.
# Избыточная проверка:
# контролируем отличие от нуля
# определителя det(T).
dt:=Determinant(T);
if dt=0 then
ERROR(`Матрица T необратима!`);
fi;
# Вычисляем частично жорданову форму J
# для
матрицы A,
# пользуясь T как матрицей перехода.
J:=MatrixInverse(T).A.T;
# Еще одна избыточная проверка:
Прил. 1                    Коды Maple-процедур            555

else

  #    Если полного жорданова базиса
  #    не существует,
  #    то мы дополняем жорданов базис в корневой сумме,
  #    содержащийся в матрице GS,
  #    до (частично жорданова) базиса
  #    во всем пространстве.

  # Составляем и приводим к ступенчатому виду
  # матрицу GSE, являющуюся конкатенацией
  # матрицы GS и единичной матрицы E.
  GSE:=;
  GSEG:=GaussianElimination(GSE);

  print(evaln(GSE)=GSE);
  print(evaln(GSEG)=GSEG);

  #    Выбираем (по ступенькам в правой зоне
  #    матрицы GSEG) добавочные векторы
  #    из правой зоны матрицы GSE
  #    и приписываем их к GS.

  for i from ms+1 to n do
    for j from ms+1 to n do
      if GSEG[i,j]<>0 then
        T:=;
        break;
      fi;
    od;
  od;

  # В итоге формируется квадратная
  # матрица T размера n на n,
  # содержащая частично жорданов базис.

  # Избыточная проверка:
  # контролируем отличие от нуля
  # определителя det(T).

  dt:=Determinant(T);
  if dt=0 then
    ERROR(`Матрица T необратима!`);
  fi;

  # Вычисляем частично жорданову форму J
  # для матрицы A,
  # пользуясь T как матрицей перехода.
  J:=MatrixInverse(T).A.T;

  # Еще одна избыточная проверка: