- •Содержание
- •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 : IntType;
f, f1 : Text;
BEGIN
ClrScr;{Очищает экран, модуль Crt}
TextColor(LightRed);{Меняет цвет символов на светло-красный, модуль Crt}
WriteLn (' РЕШЕНИЕ СЛАУ (ленточной симметричной) МЕТОДОМ ХОЛЕССКОГО');
WriteLn;
TextColor(LightGray);{Меняет цвет символов на светло-серый, модуль Crt}
Assign(f, NameFile);
Reset(f);
{Чтение исходной системы уравнений из файла}
ReadLn(f, N);
Assign(f1, NameOut);
Rewrite(f1);
WriteLn(f1,' ИСХОДНАЯ СИСТЕМА УРАВНЕНИЯ:');
{Запись исходной системы в выходной файл}
For i:= 1 to N do
begin
For j:= 1 to N do
begin
Read(f,a[i,j]);
Write (f1,' ',a[i,j]:3:1);
end;
ReadLn(f,b[i]);
WriteLn(f1,' ',b[i]:5:3);
end;
Close(f);
{Дублирование матриц}
For i:= 1 to N do
For j:= 1 to N do
a1[i,j]:= a[i,j];
For i:= 1 to N do
b1[i]:= b[i];
{Разложение матрицы на множители}
for i:=1 to N do
begin
JEnd:=N-i;
for j:=0 to Jend do
begin
for k:=i-1 downto 1 do
begin
k1:=k;
A[i+j,i]:=A[i+j,i]-A[i,k1]*A[i+j,k1];
end;
if j=0 then A[i,i]:=Sqrt(A[i,i])
else A[i+j,i]:=A[i+j,i]/A[i,i]
end;
end;
{Обратная подстановка }
for i:=1 to N do
begin
sum:=B[i];
for k:=i-1 downto 1 do
begin
sum:=sum-A[i,k]*X[k];
end;
X[i]:=sum/A[i,i];
end;
for i:=N downto 1 do
begin
sum:=X[i];
for k:=i+1 to n do
begin
sum:=sum-A[k,i]*X[k];
end;
x[i]:=Sum/A[i,i];
end;
{Вычисление невязки}
Eps:=0;
For i:= 1 to N do
begin
Sum:=0;
for j:= 1 to N do
begin
Sum:=Sum+x[J]*a1[i,j];
end;
Eps:=Abs(Sum-b1[i]);
WriteLn('x[',i:2,']= ',x[i]:3:10,' Невязка ', Eps:3:10);
end;
WriteLn('Максимальная невязка ', Eps:3:10);
TextColor(LightRed);{Меняет цвет символов на светло-красный, модуль Crt}
WriteLn (' **************** РЕЗУЛЬТАТ ****************');
TextColor(LightGreen);{Меняет цвет символов на светло-зеленый, модуль Crt}
WriteLn(' РЕЗУЛЬТАТЫ ');
For i:=1 to N do Writeln(' x[',I:2,']= ',x[i]:7:3);
WriteLn(f1, ' РЕЗУЛЬТАТЫ ');
For i:=1 to N do Writeln(f1,' x[',I:2,']= ',x[i]:7:3);
Close(f1);
WriteLn (' ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ!!!');
Repeat Until KeyPressed; {Ожидает нажатия любой клавиши, модуль Crt}
ClrScr;{Очищает экран, модуль Crt}
END.
Рассмотрим метод Холесского применительно к матрице, хранимой в виде нижнего треугольника.
Пример 1.14 (для симметричных матриц).
Program Cholessky;
{Решение СЛАУ методом Холесского }
{ЛЕНТОЧНАЯ МАТРИЦА, хранится в виде нижнего треугольника}
Uses CRT;
Const
NameFile = 'D:\PASCAL\PRIMER\CHOLES\ChoLent.dat';
NameOut = 'D:\PASCAL\PRIMER\CHOLES\ChoLent.out';
Type
RealType = Real;
IntType = Byte;
Var
a, a1 : array [1..9,1..9] of RealType;
b, b1, x : array [1..9] of RealType;
sum, Eps : RealType;