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

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

f, f1 : Text;

{ SetLength(A, N+1, C+1+1);SetLength(B, N+1);}

BEGIN

{

C:=3; N:=5;

For i:=1 to N do

begin

for j:=1 to C+1 do

begin

A[i,j]:=Random(5)+0.5*5;

if j=C+1 then A[i,j]:=Abs(A[i,j])*10;

end;

B[i]:=Random(5);

end;

for i:=1 to C do for j:=1 to C-i+1 do A[i,j]:=0;

}

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

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

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

WriteLn;

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

Assign(f, NameFile);

Reset(f);

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

ReadLn(f, N, C);

C:= C-1;

For i:=1 to N do

begin

for j:=1 to C+1 do

begin

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

end;

ReadLn(f,b[i]);

end;

Close(f);

Assign(f1, NameOut);

Rewrite(f1);

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

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

WriteLn(f1, N,' ',C+1);

for i:=1 to N do

begin

for j:=1 to C+1 do write(f1,A[i,j]:3:1,' ');

WriteLn(f1,' ',B[i]:3:1);

end;

for i:=1 to N do

begin

Jend:=C;

if i+Jend > N then Jend:=N-i;

for j:=0 to Jend do

begin

for k:=C downto j+1 do

begin

A[i+j,C+1-j]:=A[i+j,C+1-j]-A[i,k]*A[i+j,k-j];

end;

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

else A[i+j,C+1-j]:=A[i+j,C+1-j]/A[i,C+1];

end;

end;

for i:=1 to N do

begin

Jend:=1; if i-C < 1 then Jend:=C-i+2;

for j:= Jend to C do

begin

B[i]:=B[i]-A[i,j]*B[i-C+j-1];

end;

B[i]:=B[i]/A[i,C+1];

end;

for i:=N downto 1 do

begin

Jend:=C; if i+Jend > N then Jend:=N-i;

for j:=1 to Jend do

begin

B[i]:=B[i]-B[i+j]*A[i+j,C-j+1];

end;

B[i]:=B[i]/A[i,C+1];

end;

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

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

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

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

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

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

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

Close(f1);

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

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

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

End.

1.1.7. Итерационные методы слау

1.1.7.1. Решение слау методом простых итераций

Будем полагать, что матрица (1.2) невырожденная. В наиболее простой форме итерационный метод решения системы можно записать в виде вычислительной процедуры

где - некоторая последовательность операторов, действующих для заданных и .

Вектор называются начальным вектором (начальным приближением), а векторы , где - точное решение, называются векторами ошибок. Векторы называются векторами невязок.

Описание метода простой итерации в развернутой форме имеет следующий вид:

,

где последовательность итераций завершается, если все элементы вектора невязок меньше заданной точности расчета (получено приемлемое решение), либо превышено заранее заданное количество итераций .

В матричной форме

,

где .

Примерный алгоритм решения данной задачи

  1. Выбрать начальный вектор ,положить , .

  2. Вычислить вектор .

  3. Принять

  4. Если и , то итерационный процесс расходится, расчет завершить аварийно. Если и , то перейти к п.6.

  5. Если , где -заданное предельное число итераций, то аварийно завершить расчет, иначе перейти к п.2 алгоритма.

  6. Конец алгоритма.

Пример 1.15.

procedure MPI(N,M:IntType; A:TMatrix; B:TVector; Var X:TVector);

{Реализация метода простых итераций}

Var