(*~\Глагол\ПриложенияЛинАл\32\к\Пара\СистЛАУкомпл\~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                               ОТДЕЛ ПроКомплLU+;
(*============================================================================*
 * НАЗНАЧЕНИЕ: 
 *   Приложение "Проверка решения систем линейных уравнений (A*x=b)
 *               методом LU разложения" для комплексных чисел в виде пары.
 *----------------------------------------------------------------------------*
 * ПРИМЕЧАНИЯ: 
 *     Система уравнений записана в файле "ПроКомплLU.дан".
 *     В этом файле 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\к\Пара\ВводВывод\",

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

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


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


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

     строк:=РАЗМЕР(дСЧматД^,0);
  столбцов:=РАЗМЕР(дСЧматД^,1);

  СОЗДАТЬ(дРешМатД,строк,столбцов);
  СОЗДАТЬ(мРешМатД,строк,столбцов);

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

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

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

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

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