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

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

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

 дСистЛАУ ИЗ "..\..\..\..\Отделы\ЛинАл\32\д\",

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Голова;
ПЕР
  n :ЦЕЛ;  (* размер вектора свободных членов *)
  nv:ЦЕЛ;  (* число векторов свободных членов *)

  A:дМатрица.Доступ; (* матрица системы *)
  B:дМатрица.Доступ; (* вектора свободных членов *)
  X:дМатрица.Доступ; (* вектора решения *)
  p:дСистЛАУ.ДкРядуПерестановок; (* перестановки для обратного хода *)

  i:ЦЕЛ; 
  ч:ИзФайла.ДкПотоку;

УКАЗ
  ч:=дМатрВВ.ОткрытиеФайла("ПроМатр2.дан");
  A:=дМатрВВ.изФайла(ч);
  B:=дМатрВВ.изФайла(ч);
             ИзФайла.Закрыть(ч);
  nv:=РАЗМЕР(B^,0);
  n:=РАЗМЕР(B^,1);

  СОЗДАТЬ(X,nv,n);

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

  дМатрВВ.наЭкран("%10.5f",A^);

    НаЭкран.ВсяЦепь("^Вектора свободных членов:^");
  ОТ i:=0 ДО nv-1 ВЫП
    дВектВВ.наЭкран("%10.5f",B[i])
  КОН;
(* После выполнения РазложитьНаLU матрицы L и U оказываются на месте матрицы A *)
  ЕСЛИ 
       дСистЛАУ.РазложитьНаLU(A^,p) = 0
  ТО
                     (* решаем систему для каждого вектора свободных членов b *)
    НаЭкран.ВсяЦепь("^Вектора решения:^");

    ОТ i:=0 ДО nv-1 ВЫП
      дСистЛАУ.РешитьИзLU(A^,B[i],p,X[i]); 
      дВектВВ.наЭкран("%10.5f",X[i])
    КОН
  ИНАЧЕ
    НаЭкран.ВсяЦепь("^Вырожденная матрица!^")
  КОН
КОН Голова;

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