Реализовать на Паскале метод вращений определения собственных значений и векторов пары симметричных матриц
const
N = 2;
e = 0.01;
var
A, Q, P: array[1..N, 1..N] of real;
x, y: array[1..N] of real;
max: real;
i, j, k: integer;
function equals(A, B: real): boolean;
begin
equals := abs(A - B) < e;
end;
function dot(a, b: array of real): real;
var
i: integer;
begin
dot := 0;
for i := 0 to high(a) do
dot := dot + a[i] * b[i];
end;
procedure print_matrix(A: array of array of real);
var
i, j: integer;
begin
for i := 0 to high(A) do begin
for j := 0 to high(A[i]) do
write(A[i][j]:6:2, ' ');
writeln;
end;
writeln;
end;
begin
A[1][1] := 3; A[1][2] := 2;
A[2][1] := 2; A[2][2] := 6;
for i := 1 to N do begin
x[i] := 1;
Q[i][i] := 1;
end;
repeat
max := 0;
for i := 1 to N do
for j := i+1 to N do
if abs(A[i][j]) > max then begin
max := abs(A[i][j]);
k := i;
l := j;
end;
if max > e then begin
// вычисление угла поворота
if equals(A[k][k], A[l][l]) then
phi := pi / 4
else
phi := 0.5 * arctan2(2*A[k][l], A[k][k] - A[l][l]);
// построение матрицы поворота
P[k][k] := cos(phi); P[k][l] := sin(phi);
P[l][k] := -sin(phi); P[l][l] := cos(phi);
// вращение системы координат
Q copy (I);
Q[k][k] := P[k][k]; Q[k][l] := P[k][l];
Q[l][k] := P[l][k]; Q[l][l] := P[l][l];
Q new copy (Q * P);
// вычисление новой матрицы B
B copy (transpose(Q new) * A * Q new);
// проверка достижения точности
if equals(B[k][l], 0) then begin
A[k][l] := 0; A[l][k] := 0;
end
else begin
A[k][l] := B[k][l]; A[l][k] := B[l][k];
A[k][k] := B[k][k]; A[l][l] := B[l][l];
end;
end;
until max < e;
// вывод результатов
writeln('eigenvalues:');
for i := 0 to high(A) do
writeln(A[i][i]:6:2);
writeln('eigenvectors:');
for i := 0 to high(Q) do begin
for j := 0 to high(Q[i]) do
write(Q new[j][i]:6:2, ' ');
writeln;
end;
end.
Вывод:
Реализовать метод вращений для нахождения собственных значений и векторов пары симметричных матриц можно на языке Паскаль следуя приведённому выше алгоритму. Найденные собственные значения и соответствующие собственные векторы могут быть использованы в различных задачах, связанных с линейной алгеброй и матричными вычислениями.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет