Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_1(СЛАУ).doc
Скачиваний:
37
Добавлен:
08.11.2019
Размер:
1.43 Mб
Скачать

I, j, k,k1, n , Jend : IntType;

f, f1 : Text;

BEGIN

ClrScr;{Очищает экран, модуль Crt}

TextColor(LightRed);{Меняет цвет символов на светло-красный, модуль Crt}

WriteLn (' РЕШЕНИЕ СЛАУ (ленточной симметричной) МЕТОДОМ ХОЛЕССКОГО');

WriteLn;

TextColor(LightGray);{Меняет цвет символов на светло-серый, модуль Crt}

Assign(f, NameFile);

Reset(f);

{Чтение исходной системы уравнений из файла}

ReadLn(f, N);

Assign(f1, NameOut);

Rewrite(f1);

WriteLn(f1,' ИСХОДНАЯ СИСТЕМА УРАВНЕНИЯ:');

{Запись исходной системы в выходной файл}

For i:= 1 to N do

begin

For j:= 1 to N do

begin

Read(f,a[i,j]);

Write (f1,' ',a[i,j]:3:1);

end;

ReadLn(f,b[i]);

WriteLn(f1,' ',b[i]:5:3);

end;

Close(f);

{Дублирование матриц}

For i:= 1 to N do

For j:= 1 to N do

a1[i,j]:= a[i,j];

For i:= 1 to N do

b1[i]:= b[i];

{Разложение матрицы на множители}

for i:=1 to N do

begin

JEnd:=N-i;

for j:=0 to Jend do

begin

for k:=i-1 downto 1 do

begin

k1:=k;

A[i+j,i]:=A[i+j,i]-A[i,k1]*A[i+j,k1];

end;

if j=0 then A[i,i]:=Sqrt(A[i,i])

else A[i+j,i]:=A[i+j,i]/A[i,i]

end;

end;

{Обратная подстановка }

for i:=1 to N do

begin

sum:=B[i];

for k:=i-1 downto 1 do

begin

sum:=sum-A[i,k]*X[k];

end;

X[i]:=sum/A[i,i];

end;

for i:=N downto 1 do

begin

sum:=X[i];

for k:=i+1 to n do

begin

sum:=sum-A[k,i]*X[k];

end;

x[i]:=Sum/A[i,i];

end;

{Вычисление невязки}

Eps:=0;

For i:= 1 to N do

begin

Sum:=0;

for j:= 1 to N do

begin

Sum:=Sum+x[J]*a1[i,j];

end;

Eps:=Abs(Sum-b1[i]);

WriteLn('x[',i:2,']= ',x[i]:3:10,' Невязка ', Eps:3:10);

end;

WriteLn('Максимальная невязка ', Eps:3:10);

TextColor(LightRed);{Меняет цвет символов на светло-красный, модуль Crt}

WriteLn (' **************** РЕЗУЛЬТАТ ****************');

TextColor(LightGreen);{Меняет цвет символов на светло-зеленый, модуль Crt}

WriteLn(' РЕЗУЛЬТАТЫ ');

For i:=1 to N do Writeln(' x[',I:2,']= ',x[i]:7:3);

WriteLn(f1, ' РЕЗУЛЬТАТЫ ');

For i:=1 to N do Writeln(f1,' x[',I:2,']= ',x[i]:7:3);

Close(f1);

WriteLn (' ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ!!!');

Repeat Until KeyPressed; {Ожидает нажатия любой клавиши, модуль Crt}

ClrScr;{Очищает экран, модуль Crt}

END.

Рассмотрим метод Холесского применительно к матрице, хранимой в виде нижнего треугольника.

Пример 1.14 (для симметричных матриц).

Program Cholessky;

{Решение СЛАУ методом Холесского }

{ЛЕНТОЧНАЯ МАТРИЦА, хранится в виде нижнего треугольника}

Uses CRT;

Const

NameFile = 'D:\PASCAL\PRIMER\CHOLES\ChoLent.dat';

NameOut = 'D:\PASCAL\PRIMER\CHOLES\ChoLent.out';

Type

RealType = Real;

IntType = Byte;

Var

a, a1 : array [1..9,1..9] of RealType;

b, b1, x : array [1..9] of RealType;

sum, Eps : RealType;