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

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

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

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

 дСистЛАУ ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",
(*
 дВекАн   ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",
*)
 дСобств  ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",
(*
  ИзФайла ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\",
*)
  НаЭкран ИЗ "..\..\..\..\Отделы\Обмен\ВводВывод\";

ПОСТ
  порядок=6;      (* порядок системы *) 
  проходов=500;   (* наибольшее допустимое число проходов вычисления *)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Голова;
ПЕР 
                      дИсхМатД:дМатрица.Доступ; (* доступ к исходной матрице                 *) 
         собстВектСтроки_дМатД:дМатрица.Доступ; (* доступ к матрице с собственными векторами (по строкам) *) 
точность_собстВектСтроки_дМатД:дМатем.Вещ;      (* точность вычислений матрицы с собственными векторами для 1 собст.значения *)
           собстЗначений_дВекД: дВектор.Доступ; (* доступ к вектору   собственных  значений  *) 
УКАЗ
  точность_собстВектСтроки_дМатД:=дМатем.квкор(дМатем.МашинEps);

  СОЗДАТЬ(      дИсхМатД,порядок,порядок);
  СОЗДАТЬ(собстВектСтроки_дМатД,порядок,порядок);
  СОЗДАТЬ(собстЗначений_дВекД,порядок);

  дСистЛАУ.ГильбертМатрица(дИсхМатД^);

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

      дВектВВ.наЭкран("%12.3e",собстЗначений_дВекД^);
    ЕСЛИ
         порядок < 7
    ТО
      НаЭкран.ВсяЦепь("^собственные вектора:^");

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

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Голова
КОН ПроССим. 
 