- •Содержание
- •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,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) невырожденная. В наиболее простой форме итерационный метод решения системы можно записать в виде вычислительной процедуры
где - некоторая последовательность операторов, действующих для заданных и .
Вектор называются начальным вектором (начальным приближением), а векторы , где - точное решение, называются векторами ошибок. Векторы называются векторами невязок.
Описание метода простой итерации в развернутой форме имеет следующий вид:
,
где последовательность итераций завершается, если все элементы вектора невязок меньше заданной точности расчета (получено приемлемое решение), либо превышено заранее заданное количество итераций .
В матричной форме
,
где .
Примерный алгоритм решения данной задачи
Выбрать начальный вектор ,положить , .
Вычислить вектор .
Принять
Если и , то итерационный процесс расходится, расчет завершить аварийно. Если и , то перейти к п.6.
Если , где -заданное предельное число итераций, то аварийно завершить расчет, иначе перейти к п.2 алгоритма.
Конец алгоритма.
Пример 1.15.
procedure MPI(N,M:IntType; A:TMatrix; B:TVector; Var X:TVector);
{Реализация метода простых итераций}
Var