Метод итераций – это численный метод нахождения собственных значений и собственных векторов матриц (для симметричных матриц) путём итеративного процесса.
Для начала, необходимо понять, что такое собственный вектор и собственное значение матрицы. Собственный вектор это вектор, который при умножении на матрицу остаётся в себе, измененным только на константу, т. е. AV = λV. Где А – матрица, λ – собственное значение, а V – собственный (картинка рекомендованного соответствует определению) вектор. На практике, это означает, что собственный вектор содержит информацию только о направлении и не изменяется при умножении матрицы на этот вектор.
Собственные значения можно найти путём решения характеристического уравнения det(А-λΙ)=0, где Ι – единичная матрица того же порядка, что и А.
Далее, сам метод итераций работает следующим образом:
1. Задаём начальный вектор X0, который является приближением к собственному вектору. Этот вектор должен быть ненулевым и нормализованным, т. е. ||X0||=1.
2. Умножаем матрицу на вектор X0: ρ1=AX0.
3. Рассчитываем собственное значение λ1 с использованием формулы Релея: λ1 = (XT0AX0) / (XT0X0), где XT0 – это транспонированный вектор X0.
4. Вычисляем новый собственный вектор X1, нормализованный по той же формуле: X1 = ρ1/||ρ1||.
5. Проверяем достигнута ли необходимая точность, если нет, то возвращаемся к шагу 2, используя X1 вместо X0.
Процедура повторяется, пока разница между собственными значениями в двух итерациях меньше заданной константы.
Далее представлено решение задачи на языке Паскаль:
program IterationMethod;
const n=3;
const eps=0.001;
type TArray = array[1..n, 1..n] of real;
type TVect = array[1..n] of real;
var A:TArray; // матрица
V, V0:TVect; // векторы
L, L0:real; // собственные значения
i, j, k:integer;
// функция определения скалярного произведения векторов
function scalar(v1, v2:TVect):real;
var i:integer;
res:real;
begin
res:=0;
for i:=1 to n do begin
res:=res+v1[i]*v2[i];
end;
scalar:= res;
end;
// функция вывода матрицы
procedure print_matrix(M:TArray);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do begin
write(M[i,j]:2:2, ' ');
end;
writeln;
end;
writeln;
end;
// функция обновления вектора X
procedure update_vector(A:TArray; var V:TVect; var L:real);
var i, j:integer;
V1:TVect;
begin
// умножение матрицы на вектор
for i:=1 to n do begin
V1[i]:=0;
for j:=1 to n do begin
V1[i]:=V1[i]+A[i,j]*V[j];
end;
end;
// определение собственного значения
L:=scalar(V, V1)/scalar(V, V);
// нормализация вектора
for i:=1 to n do begin
V[i]:=V1[i]/sqrt(scalar(V1, V1));
end;
end;
begin
// задаем матрицу
A[1,1]:=2; A[1,2]:=-1; A[1,3]:=0;
A[2,1]:=-1; A[2,2]:=2; A[2,3]:=-1;
A[3,1]:=0; A[3,2]:=-1; A[3,3]:=2;
// задаем начальное приближение
V[1]:=1; V[2]:=0; V[3]:=1;
V0:=V; // сохраняем начальное приближение для вывода результатов на экран
repeat
// обновляем вектор
update_vector(A, V, L);
// проверяем условие остановки
if abs(L-L0)<eps then break;
// сохраняем новые значения для дальнейшего использования
L0:=L;
V0:=V;
until false;
// выводим результаты на экран
writeln('Result: ');
writeln('Eigenvalue: ', L:2:4);
writeln('Eigenvector: ');
for i:=1 to n do begin
write(V[i]:2:4, ' ');
end;
writeln;
writeln;
writeln('Initial vector: ');
for i:=1 to n do begin
write(V0[i]:2:4, ' ');
end;
writeln;
writeln;
writeln('Matrix: ');
print_matrix(A);
end.
В данной программе мы задаем матрицу A размера 3х3, а также начальное приближение для вектора, задавая его элементы V[1], V[2] и V[3]. Затем, путем обновления вектора X, мы находим собственные значения и векторы. Обновление происходит до тех пор, пока значение собственного числа не перестанет меняться больше, чем на заданную точность. Результат вычислений выводится в консоль.