- •Содержание
- •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;
h : RealType;
q : TVector;
SS : String;
Begin
N := Form1.SpinEdit1.Value;
{Прямой ход: исключения переменных}
For k:= 1 to N do
For i:= k+1 to N do
If i<>k Then
begin
q[i]:= -A[i,k]/A[k,k];
For j:= 1 to N do
If j=k Then A[i,j]:=0
else
A[i,j]:= A[i,j]+ q[i]*A[k,j];
B[i]:=B[i]+q[i]*B[k];
Form1.ProgressBar1.Position:=Round(100*i/N);
end
else Continue;
{обратный ход: решение}
X[N]:= B[N]/A[N,N];
For i:= N-1 downto 1 do
begin
h:= B[i];
For j:= i+1 to N do h:= h - X[j] * A[i,j];
X[i]:= h/A[i,i];
Form1.ProgressBar1.Position:=Round(100/N*((N+1)-i));
end;
For i:= 1 to N do
Form1.StringGrid1.Cells[N+2, i] := FloatToStrF(1.0*X[i],ffGeneral,3,3);
{Вывод матрицы A, вектора В}
Form1.Memo1.Lines.Add(' Вывод матрицы A, вектора В ');
For i := 1 to N do
begin
SS := '';
For j := 1 to N do
begin
SS := SS+ Format('%f'#9, [A[i,j]]);
end;
SS := SS+ Format('%f'#9, [B[i]]);
Form1.Memo1.Lines.Add(SS);
end;
Блок-схема алгоритма прямого хода классического метода Гаусса
Рис. 1.1а. Прямой ход исключения классического метода Гаусса.
Блок-схема алгоритма обратного хода классического метода Гаусса
Рис. 1.1б. Обратный ход исключения классического метода Гаусса.
В заключении отметим, что классический метод Гаусса не применим, если в ходе расчёта на главной диагонали оказался нулевой элемент. Кроме того, если на главной диагонали оказался слишком маленький по значению элемент (мало отличим от нуля) и если эта строка умножается на большие числа, то это приводит к значительным ошибкам округления при вычитаниях, т.е. имеется большая потеря точности при значениях диагональных элементов, близких к нулю.
При реализации данного метода требуется:
выполнить арифметических операций, в том числе умножений и делений;
одновременно запоминать промежуточных результатов.
Метод рекомендуется применять в тех случаях, когда:
от решения требуется не очень высокая степень точности;
прямой метод используется для получения начального приближения с последующим уточнением по итерационной схеме;
требуется решить систему высокого порядка, у которой матрица коэффициентов имеет подавляющее количество нулевых элементов.
1.1.6.2. Метод Гаусса с выбором главного элемента
Современные исследования, относящиеся к гауссову исключению, вскрыли важность двух идей: необходимости выбора главного элемента и правильной интерпретации ошибок округления.
Метод Гаусса с выбором главного элемента (метод главных элементов) заключается в том, что при прямом ходе производится выбор наибольшего по модулю (главного) из всех элементов рассматриваемого столбца. Такая процедура называется выбором главного элемента столбца.
Последнее исключает деление на ноль, если матрица содержит нулевые элементы, и повышает точность вычислений при наличии ошибок округления.
Количество арифметических операций в методе Гаусса связано с размерностью системы и примерно равно . В методе Гаусса с выбором главного элемента погрешность округления обычно невелика. Только для плохо обусловленных систем устойчивость этого метода оказывается недостаточной.
Погрешность округления можно ещё уменьшить, если выбирать в каждом цикле элемент, максимальный по модулю во всей матрице. Однако точность при этом возрастает не сильно по сравнению со случаем выбора главного элемента, а расчёт заметно усложняется, ибо требуется перестановка не только строк, но и столбцов.
Контроль полученных решений можно провести путем их подстановки в исходную СЛАУ и вычисления невязок rB kB , разностей между правыми и левыми частями уравнений:
При малой погрешности решений величины rB kB будут близки к нулю.
Пример 1.6
{Прямой ход исключения переменных}
For k:= 1 to N do
begin
S:= a[k,k];
J:= k;
{Выбор главного элемента}
For I:= k+1 to N do
begin
R:= a[i,k];
If Abs(R) > Abs(S) then
begin
S:= R;
J:= i;
end;
end;
If S = 0.0 then Exit;
{Перестановка уравнений}
If j<>k then For I:= k to N do
begin
R:= a[k,i];
a[k,i]:= a[j,i];
a[j,i]:= R;
end;
R:= b[k];
b[k]:= b[j];
b[j]:= R;
{Продолжение прямого хода}
For j:= k+1 to N do a[k,j]:= a[k,j]/S;
b[k]:= b[k]/S;
For i:= k+1 to N do
begin
R:= a[j,k];
For j:= k+1 to N do a[i,j]:= a[i,j] - a[k,j]*R;
b[i]:= b[i] – b[k]*R;
end;
end;
{Обратный ход: последовательное нахождение корней }
If S <> 0.0 then
For i:= N Downto 1 do
begin
S:= b[i];
For j:= i+1 to N do S:= S – x[j]*a[i,j];
x[i]:= S;
end;
Второй вариант программы под Delphi
Procedure FactorizGlavn(N:IntType; Var A:TMatrix; Var B:TVector; Var X:TVector);
//Метод Гаусса с выбором главного элемента
Var
k,i,j : IntType;
R,S : RealType;
SS : String;
Begin
{Прямой ход}
For k:=1 to N do
begin
S:= A[k,k];
j:=k;
{Выбор главного элемента}
For i:=k+1 to N do
begin
R:= A[i,k];
If Abs(R)>Abs(S) Then
begin
S:= R;
j:=i;
end;
end;
If S=0.0 Then Exit;
{Перестановка уравнений}
If j<>k Then For i:=k to N do
begin
R:=A[k,i];
A[k,i]:= A[j,i];
A[j,i]:= R;
end;
R:= B[k];
B[k]:= B[j];
B[j]:= R;
{Продолжение прямого хода}
For j:=k+1 to N do A[k,j]:=A[k,j]/S;
B[k]:= B[k]/S;
For i:=k+1 to N do
begin
R:= A[i,k];
For j:=k+1 to N do A[i,j]:= A[i,j]-A[k,j]*R;
For j:=1 to k do A[i,j]:= 0;
B[i]:= B[i] - B[k]*R;
end;
end;
{Вывод результатов}
Form1.Memo1.Lines.Add('Треугольная матрица A (м.Гаусса с выбором гл. элем.)');
For i := 1 to N do
begin
SS := '';
For j := 1 to N do
begin
SS := SS+ Format('%f'#9, [A[i,j]]);
end;
SS := SS+ Format('%f'#9, [B[i]]);
Form1.Memo1.Lines.Add(SS);
end;
End; {Factoriz}
Procedure SolutionGlavn(N:IntType;A:TMatrix; B:TVector;Var X:TVector);
//Решение
Var
S: RealType;