(*~\Глагол\ПриложенияЛинАл\32\д\СистЛАУдейств\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                                    ОТДЕЛ ПроСВект+;
(*============================================================================*
 * НАЗНАЧЕНИЕ: 
 *   нахождение тех собственных векторов квадратной матрицы, которые
 *   соответствуют вещественным собственным значениям
 * ПРИМЕЧАНИЯ: 
 *     Исходная матрица записана в файле "ПроМатр5.дан".
 *     В этом файле 1-я строка содержит размер матрицы (строк и столбцов),
 *  а последующие строки содержат значения элементов матрицы.
 *============================================================================*)

ИСПОЛЬЗУЕТ
(*
 дМатем   ИЗ "..\..\..\..\Отделы\ЧисАн\32\д\",
*)
 дВектор  ИЗ "..\..\..\..\Отделы\ЧисАн\32\д\",
 дМатрица ИЗ "..\..\..\..\Отделы\ЧисАн\32\д\",

 дВектВВ  ИЗ "..\..\..\..\Отделы\ЧисАн\32\д\ВводВывод\",
 дМатрВВ  ИЗ "..\..\..\..\Отделы\ЧисАн\32\д\ВводВывод\",
(*
 дСистЛАУ ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",

 дВекАн   ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",
*)
  дСобств ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",

  ИзФайла ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\",
  НаЭкран ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\";

ПОСТ                   (* точность для вычислений соб.векторов 64-х разрядная *)
  точность_дСобстВект = 1.D-6;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Голова;
ПЕР
  ч:ИзФайла.ДкПотоку;
        дИсхМатД,
      дЗапасМатД:дМатрица.Доступ; (* исходная и запасная матрица *)
      дСобстВекД: дВектор.Доступ; (* соб. вектора *)
дСобстЗнач_кВекД,                 (* вектор действительных компонент соб.значений *)
мСобстЗнач_кВекД: дВектор.Доступ; (* вектор мнимых         компонент соб.значений *)
  i,n:ЦЕЛ;
УКАЗ
         ч:=дМатрВВ.ОткрытиеФайла("ПроМатр5.дан");
  дИсхМатД:=дМатрВВ.изФайла(ч);
                    ИзФайла.Закрыть(ч);
  n:=РАЗМЕР(дИсхМатД^);

  СОЗДАТЬ(дЗапасМатД,n,n);

  дМатрица.Списать(дИсхМатД^,дЗапасМатД^);

  НаЭкран.ВсяЦепь("^Исходная матрица:^");

  дМатрВВ.наЭкран("%8.4f",дИсхМатД^);

  СОЗДАТЬ(дСобстЗнач_кВекД,n);
  СОЗДАТЬ(мСобстЗнач_кВекД,n);
  СОЗДАТЬ(дСобстВекД,n);

  ЕСЛИ
       дСобств.Значений_кВектор(дИсхМатД^,дСобстЗнач_кВекД^,мСобстЗнач_кВекД^) = 0
  ТО
          НаЭкран.ВсяЦепь("^Действительная часть собственных значений:^");

    дВектВВ.наЭкран("%8.4f",дСобстЗнач_кВекД^);

          НаЭкран.ВсяЦепь("^Мнимая часть собственных значений:^");

    дВектВВ.наЭкран("%8.4f",мСобстЗнач_кВекД^);
    ОТ i:=0 ДО n-1 ВЫП
      ЕСЛИ мСобстЗнач_кВекД[i] = 0 ТО

          НаЭкран.Вещ4числа("^Действительное собственное значение: %8.4f^",дСобстЗнач_кВекД[i],0,0,0);
        ЕСЛИ
             дСобств.Вектор_1собЗначения(дИсхМатД^,дСобстЗнач_кВекД[i],УЗК(точность_дСобстВект),дСобстВекД^) = 0
        ТО
          НаЭкран.ВсяЦепь("Соответствующий собственный вектор:^");

          дВектВВ.наЭкран("%8.4f",дСобстВекД^);
        ИНАЧЕ
          НаЭкран.ВсяЦепь("Нет схождения!^")
        КОН
      КОН 
    КОН
  ИНАЧЕ
          НаЭкран.ВсяЦепь("^Нет схождения!^")
  КОН
КОН Голова;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Голова
КОН ПроСВект.
