(*~\Глагол\Отделы\ЛинАл\32\к\Набор\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                         ОТДЕЛ кнСобств;
(*============================================================================*
 * НАЗНАЧЕНИЕ: вычисление собственных значений и собственных векторов
 *  (для комплексных в виде набора из 2-х чисел с плавающей точкой в 32 разряда)
 *                              Матричный Анализ для комплексных в виде набора
 *============================================================================*)

ИСПОЛЬЗУЕТ
 дМатем   ИЗ "..\..\..\..\..\Отделы\ЧисАн\32\д\",

 дВектор  ИЗ "..\..\..\..\..\Отделы\ЧисАн\32\д\",
 дМатрица ИЗ "..\..\..\..\..\Отделы\ЧисАн\32\д\";
(*
кнВектор  ИЗ "..\..\..\..\..\Отделы\ЧисАн\32\к\Набор\",
кнМатрица ИЗ "..\..\..\..\..\Отделы\ЧисАн\32\к\Набор\";
*)

ВИД 
        (* вид Вещ - это удвоенная точность 32 разряда (6 десятичных знаков)  *)
  Вещ = дМатем.Вещ;                   (* локально *)


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


(*----------------------------------------------------------------------------*)
ЗАДАЧА^ Значений_кВектор-(               A+:дМатрица.Вид;
                          дСобстЗнач_кВект+,
                          мСобстЗнач_кВект+: дВектор.Вид):ЦЕЛ;
(* Цель:  вычисление собственных значений квадратной матрицы
 *----------------------------------------------------------------------------*
 * До:    <A>     - исходная матрица
 * После: <дСобстЗнач_кВект> - действительная часть собственных значений
 *        <мСобстЗнач_кВект> -   мнимая       часть собственных значений
 *        <A>     - разрушенная исходная матрица
 * Ответ: 0 или дМатрица.НЕТ_СХОДИМОСТИ *)

(*----------------------------------------------------------------------------*)
ЗАДАЧА^ КорниПолинома-(         Коэфф-:дВектор.Вид; степень:ЦЕЛ;
                       дКорни+,мКорни+:дВектор.Вид):ЦЕЛ;
(* Цель:  вычисление вектора действительных и мнимых корней
 *        действительного полинома методом companion матрицы
 *----------------------------------------------------------------------------*
 * До:    <Коэфф>   - вектор коэффициентов действительного полинома
 *        <степень> - степень этого полинома
 * После: <дКорни> - действительные части корней (в порядке возрастания)
 *        <мКорни> - мнимые         части корней
 * Ответ: 0 или дМатрица.НЕТ_СХОДИМОСТИ *)


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Значений_кВектор-(               A+:дМатрица.Вид;
                         дСобстЗнач_кВект+,
                         мСобстЗнач_кВект+: дВектор.Вид):ЦЕЛ;
(* Цель:  вычисление собственных значений квадратной матрицы
 *----------------------------------------------------------------------------*
 * До:    <A>       - исходная матрица
 * После: <дСобстЗнач_кВект> - действительная часть собственных значений
 *        <мСобстЗнач_кВект> -   мнимая       часть собственных значений
 *        <A>       - разрушенная исходная матрица
 * Ответ: 0 или дМатрица.НЕТ_СХОДИМОСТИ *)
УКАЗ
  Balance(A);
  ElmHes(A);
  ВОЗВРАТ Hqr(A,дСобстЗнач_кВект,мСобстЗнач_кВект)
КОН Значений_кВектор;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КорниПолинома-(         Коэфф-:дВектор.Вид; степень:ЦЕЛ;
                      дКорни+,мКорни+:дВектор.Вид):ЦЕЛ;
(* Цель:  вычисление вектора действительных и мнимых корней
 *        действительного полинома методом companion матрицы
 *----------------------------------------------------------------------------*
 * До:    <Коэфф>   - вектор коэффициентов действительного полинома
 *        <степень> - степень этого полинома
 * После: <дКорни> - действительные части корней (в порядке возрастания)
 *        <мКорни> - мнимые         части корней
 * Ответ: 0 или дМатрица.НЕТ_СХОДИМОСТИ *)
ПЕР
  n:ЦЕЛ;             (* размер матрицы *)
  i,j,k:ЦЕЛ;  
  код:ЦЕЛ;
  врем:Вещ;
  companionМатД:дМатрица.Доступ;   (* companion матрица nxn *)
УКАЗ
  n:=степень-1;
  СОЗДАТЬ(companionМатД,n+1,n+1);

  (* заполняем companion матрицу *)
  ОТ j:=0 ДО n ВЫП
    companionМатД[0,j]:=-Коэфф[степень-j-2]/Коэфф[степень-1]
  КОН;
  ОТ j:=0 ДО n-1 ВЫП
    companionМатД[j+1,j]:=1 
  КОН;

       (* корни полинома являются и собственными значениями companion матрицы *)
  Balance(companionМатД^);
  код := Hqr(companionМатД^,дКорни,мКорни);

  ЕСЛИ код = 0 ТО
         (* упорядочивание корней в порядке возрастания действительных частей *)
    ОТ i:=0 ДО n-1 ВЫП
      k:=i;
      врем:=дКорни[i];
      ОТ j:=i+1 ДО n ВЫП
        ЕСЛИ дКорни[j] < врем ТО
          k:=j;
          врем:=дКорни[j]
        КОН 
      КОН;
      Матем.обмен(дКорни[i],дКорни[k]);
      Матем.обмен(мКорни[i],мКорни[k])
    КОН
  КОН;
  ВОЗВРАТ код
КОН КорниПолинома;

КОН кнСобств.
