- •Содержание
- •1. Численные методы в электротехнических задачах
- •1.1. Численные методы решения систем линейных алгебраических уравнений (слау)
- •1.1.1. Классификация методов
- •1.1.2. Обусловленность системы уравнений
- •1.1.3. Собственные значения и собственные векторы матриц
- •1.1.4. Векторные нормы
- •1.1.5. Методы решения некорректных задач
- •1.1.6. Точные методы расчёта слау
- •1.1.6.1. Классический метод Гаусса
- •I, j, k : IntType;
- •1.1.6.2. Метод Гаусса с выбором главного элемента
- •I,j,k: IntType;
- •I, j, k : IntType;
- •1.1.6.3. Гауссово исключение и lu-разложение
- •1.1.6.4. Матрично-векторные формы - разложения
- •1.1.6.5. Алгоритм Донгарры-Айзенштата.
- •Var I,j,k,s : Integer;
- •Var I,j,k : Integer;
- •1.1.6.6. Метод вращения
- •I, j, k : IntType;
- •I, j, k : IntType;
- •1.1.6.7. Схема Жордана
- •I,j,k : IntType;
- •I, j, k : IntType;
- •1.1.6.8. Факторизация
- •1.1.6.9. Метод квадратных корней (Холесского)
- •I, j, k : IntType;
- •1.1.6.10. Итерационное уточнение
- •1.1.6.11. Особенности решения слау для ленточных симметричных и несимметричных матриц
- •Алгоритм классического метода Гаусса для ленточной симметричной матрицы
- •I, j, k,k1, n , Jend : IntType;
- •I, j, k,k1, n , Jend, c : IntType;
- •1.1.7. Итерационные методы слау
- •1.1.7.1. Решение слау методом простых итераций
- •I, j, k : IntType;
- •X0 : tVector;
- •1.1.7.2. Решение слау методом Гаусса-Зейделя
- •I, j, k : IntType;
- •X0 : tVector;
- •1.1.7.3. Метод релаксации
- •I, j, k : IntType;
- •X0 : tVector;
- •Литература
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) можно представить в виде
,
где
Отсюда получаем
Примерный алгоритм решения данной задачи
Выбрать начальный вектор ,положить , .
Вычислить вектор .
Принять
Если и , то итерационный процесс расходится, расчет завершить аварийно. Если и , то перейти к п.6.
Если , где -заданное предельное число итераций, то аварийно завершить расчет, иначе перейти к п.2 алгоритма.
Конец алгоритма.
Метод ускоренной итерации позволяет ограничиться одним массивом для хранения искомых переменных.
Существенными вопросом при выборе данных методов для решения конкретных задач является скорость сходимости итерационного процесса к решению, которая зависит от начального приближения и от особенностей матрицы .
Методы простой и ускоренной итерации сходятся к точному решению, если матрица имеет диагональное преобладание. В противном случае решение не гарантировано.
При построении реальных вычислительных схем часто пытаются ускорить процесс решения введением специальных ускоряющих коэффициентов.
Тогда полученное значение переменной можно скорректировать следующим образом:
,
где -коэффициенты ускорения и замедления, часто принимают ; .
- разность решений на двух итерациях.
Таким образом, если направление (знак) приращения переменной не меняется на двух последовательных итерациях, то «движение к решению» пытаются ускорить, в противном случае пытаются подавить колебательный процесс сходимости с помощью уменьшения приращения переменной.
Такой подход требует выполнения дополнительных операций и дополнительной памяти для хранения вектора приращений переменных .
Пример 1.16.
procedure Zeydel(N,M:IntType; A:TMatrix; B:TVector; Var X:TVector);
{Реализация метода Зейделя}
Var