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

I, j, k : IntType;

X0 : tVector;

H,Err : RealType;

S : String;

Flag : Boolean;

begin

Form1.Memo1.Visible:= True;

Form1.Memo1.Clear;

Form1.Chart1.SeriesList[0].Clear;

For i:= 1 to N do X0[i]:= 0.0;

k:=0;

Flag:= False;

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

While (Flag = False) and (k <= M) do

begin

{Подготовка к итерации}

Flag:= True; {Решение найдено}

Err:=0;

For i:=1 to N do

begin

X[i]:= -B[i];

For j:=1 to N do X[i]:= X[i]+A[i,j]*X0[j];

{Проверка решения}

Err:= Err+Abs(X[i]/A[i,i])/N;

If Err >= Epsilon Then Flag:= False;

{Новое приближение}

{X[i]:= X0[i] - (X[i]/A[i,i]}; {без коэффициента релаксации}

X[i]:= X0[i] - 0.9*(X[i]/A[i,i]); {С коэффициентом релаксации}

end;

For i:=1 to N do X0[i]:= X[i];

Form1.Chart1.SeriesList[0].AddXY(k,Err);

k:= k+1;

{Заполнение Form1.ProgressBar2}

Form1.ProgressBar2.Position:=Round(100*k/M);

end;

Form1.SpinEdit2.Value:= k; {Вывод количества итераций}

Form1.Memo1.Visible:= True;

Form1.Memo1.Clear;

Form1.Memo1.Lines.Add('Метод простых итераций.');

If Flag= True Then Form1.Memo1.Lines.Add('Заданная точность 0.01 достигнута');

If Flag= False Then

begin

Form1.Memo1.Lines.Add('Заданная точность 0.01 не достигнута.');

Form1.Memo1.Lines.Add(Format('при k = %d', [k]));

Form1.Memo1.Lines.Add('Увеличьте количество итераций.');

end;

For i := 1 to N do

Form1.Memo1.Lines.Add(Format('X[%d] = %f', [i, X[i]]));

For i:= 1 to N do

Form1.StringGrid1.Cells[N+3, i]:= FloatToStrF(1.0*X[i],ffGeneral,3,3);

end;

1.1.7.2. Решение слау методом Гаусса-Зейделя

Для ускорения сходимости в правой части используют не только значения неизвестных , вычисленных на предыдущих итерациях, но также рассчитанные ранее на этой же итерации и имеющие индексы . В этом случае говорят о методе ускоренной итерации, часто называемом также методом Гаусса-Зейделя. Схема решения имеет следующий вид:

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

,

где - верхняя и нижняя треугольные матрицы, содержащие нули на главной диагонали и такие, что .

В итерационном методе Зейделя последовательно уточняются компоненты решения, причем компонента находится из -го уравнения. Именно, если , то следующее приближение определяется из системы соотношений:

(1.4)

Систему (1.4) можно представить в виде

,

где

Отсюда получаем

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

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

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

  3. Принять

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

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

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

Метод ускоренной итерации позволяет ограничиться одним массивом для хранения искомых переменных.

Существенными вопросом при выборе данных методов для решения конкретных задач является скорость сходимости итерационного процесса к решению, которая зависит от начального приближения и от особенностей матрицы .

Методы простой и ускоренной итерации сходятся к точному решению, если матрица имеет диагональное преобладание. В противном случае решение не гарантировано.

При построении реальных вычислительных схем часто пытаются ускорить процесс решения введением специальных ускоряющих коэффициентов.

Тогда полученное значение переменной можно скорректировать следующим образом:

,

где -коэффициенты ускорения и замедления, часто принимают ; .

- разность решений на двух итерациях.

Таким образом, если направление (знак) приращения переменной не меняется на двух последовательных итерациях, то «движение к решению» пытаются ускорить, в противном случае пытаются подавить колебательный процесс сходимости с помощью уменьшения приращения переменной.

Такой подход требует выполнения дополнительных операций и дополнительной памяти для хранения вектора приращений переменных .

Пример 1.16.

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

{Реализация метода Зейделя}

Var