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

I, j, k : IntType;

X0 : tVector;

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:= 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.7*(X[i]/A[i,i]);

X0[i]:= X[i]

end;

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('Заданная точность '+FloatToStr(Epsilon)+' достигнута');

If Flag= False Then

begin

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

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.3. Метод релаксации

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

, (1.5)

положим

(1.6)

где - релаксационный параметр. Если подставить решение уравнения (1.5) в уравнение (1.6), то после группировки слагаемых получим

,

и с помощью итерацию можно записать в виде

(1.7)

Здесь - соответственно диагональная, строго нижняя треугольная и строго верхняя треугольная матрицы (т. е. диагональные элементы матриц и равны нулю).

Очевидно, что в случае итерация (1.7) сводится к методу Гаусса-Зейделя. Итерацию (1.7) при произвольных значениях называют методом последовательной верхней релаксации (сокращенно методом ПВР), иногда в литературе этот термин используют лишь в случае .

Как показала практика вычислений при ( -симметричная, вещественная матрица) целесообразно брать показатель релаксации в пределах ; в случае метод релаксации обычно называют методом сверхрелаксации.

В частности, во многих случаях оптимальное значение параметра релаксации определяется экспериментально.

Пример 1.14 Метод последовательной верхней релаксации

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

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

Var