Is it possible to find complex eigenvalues with QR decomposition?
$begingroup$
I wonder if it's possible to find the complex eigenvalues with QR decomposition. I can find the real eigenvalues with QR just by doing this.
function [R] =findEig(A,k)
for i=1:k
[Q,R] =qr(A);
A=R*Q;
end
end
Let's say I have a matrix $A$
>> A
A =
2.00000 3.00000 1.00000 0.50000 4.00000
4.00000 5.00000 7.00000 0.10000 1.00000
5.00000 3.00000 6.00000 19.20000 9.00000
1.00000 4.00000 1.00000 4.00000 7.00000
3.00000 1.00000 6.00000 2.00000 6.00000
Then I can run the function where I want to do 10 iterations.
>> R = findEig(A, 10)
R =
-21.35929 -9.38466 6.85281 -4.68212 -2.85981
0.00000 6.67519 -3.58144 3.60920 5.73361
0.00000 0.00000 7.31262 -0.27010 -3.36928
0.00000 0.00000 0.00000 -4.32428 -0.28359
0.00000 0.00000 0.00000 0.00000 1.25801
>> eig(A)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
As you can see. On the diagonal of matrix $R$, we can see that it has the same eigenvalues as the eigenvalues above, but $R$ does not show the complex eigenvalues. The more iteration I do, the better result I will get. But not for the complex eigenvalues.
So is there possible to find the complex eigenvalues with QR?
eigenvalues-eigenvectors numerical-linear-algebra
$endgroup$
add a comment |
$begingroup$
I wonder if it's possible to find the complex eigenvalues with QR decomposition. I can find the real eigenvalues with QR just by doing this.
function [R] =findEig(A,k)
for i=1:k
[Q,R] =qr(A);
A=R*Q;
end
end
Let's say I have a matrix $A$
>> A
A =
2.00000 3.00000 1.00000 0.50000 4.00000
4.00000 5.00000 7.00000 0.10000 1.00000
5.00000 3.00000 6.00000 19.20000 9.00000
1.00000 4.00000 1.00000 4.00000 7.00000
3.00000 1.00000 6.00000 2.00000 6.00000
Then I can run the function where I want to do 10 iterations.
>> R = findEig(A, 10)
R =
-21.35929 -9.38466 6.85281 -4.68212 -2.85981
0.00000 6.67519 -3.58144 3.60920 5.73361
0.00000 0.00000 7.31262 -0.27010 -3.36928
0.00000 0.00000 0.00000 -4.32428 -0.28359
0.00000 0.00000 0.00000 0.00000 1.25801
>> eig(A)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
As you can see. On the diagonal of matrix $R$, we can see that it has the same eigenvalues as the eigenvalues above, but $R$ does not show the complex eigenvalues. The more iteration I do, the better result I will get. But not for the complex eigenvalues.
So is there possible to find the complex eigenvalues with QR?
eigenvalues-eigenvectors numerical-linear-algebra
$endgroup$
$begingroup$
I believe the double shift algorithm exists for qr iteration to find complex eigenvalues. Not recalling why the original doesn't find it
$endgroup$
– TrostAft
Jan 14 at 1:54
$begingroup$
Is there another way to find these? I can use shur to find all eigenvalues, even if they are complex. But shur will only show the real part of the complex parts.
$endgroup$
– Daniel Mårtensson
Jan 14 at 15:28
$begingroup$
The schur() function produces a "quasi-triangular" matrix with 2x2 blocks on the diagonal corresponding to complex conjugate pairs of eigenvalues. If you apply a random complex unitary similarity transformation to the matrix before calling schur() on the matrix, then the schur() function will return an upper triangular matrix with the complex eigenvalues on the diagonal. This is a parlor trick but not very useful in practice.
$endgroup$
– Brian Borchers
Jan 17 at 0:39
add a comment |
$begingroup$
I wonder if it's possible to find the complex eigenvalues with QR decomposition. I can find the real eigenvalues with QR just by doing this.
function [R] =findEig(A,k)
for i=1:k
[Q,R] =qr(A);
A=R*Q;
end
end
Let's say I have a matrix $A$
>> A
A =
2.00000 3.00000 1.00000 0.50000 4.00000
4.00000 5.00000 7.00000 0.10000 1.00000
5.00000 3.00000 6.00000 19.20000 9.00000
1.00000 4.00000 1.00000 4.00000 7.00000
3.00000 1.00000 6.00000 2.00000 6.00000
Then I can run the function where I want to do 10 iterations.
>> R = findEig(A, 10)
R =
-21.35929 -9.38466 6.85281 -4.68212 -2.85981
0.00000 6.67519 -3.58144 3.60920 5.73361
0.00000 0.00000 7.31262 -0.27010 -3.36928
0.00000 0.00000 0.00000 -4.32428 -0.28359
0.00000 0.00000 0.00000 0.00000 1.25801
>> eig(A)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
As you can see. On the diagonal of matrix $R$, we can see that it has the same eigenvalues as the eigenvalues above, but $R$ does not show the complex eigenvalues. The more iteration I do, the better result I will get. But not for the complex eigenvalues.
So is there possible to find the complex eigenvalues with QR?
eigenvalues-eigenvectors numerical-linear-algebra
$endgroup$
I wonder if it's possible to find the complex eigenvalues with QR decomposition. I can find the real eigenvalues with QR just by doing this.
function [R] =findEig(A,k)
for i=1:k
[Q,R] =qr(A);
A=R*Q;
end
end
Let's say I have a matrix $A$
>> A
A =
2.00000 3.00000 1.00000 0.50000 4.00000
4.00000 5.00000 7.00000 0.10000 1.00000
5.00000 3.00000 6.00000 19.20000 9.00000
1.00000 4.00000 1.00000 4.00000 7.00000
3.00000 1.00000 6.00000 2.00000 6.00000
Then I can run the function where I want to do 10 iterations.
>> R = findEig(A, 10)
R =
-21.35929 -9.38466 6.85281 -4.68212 -2.85981
0.00000 6.67519 -3.58144 3.60920 5.73361
0.00000 0.00000 7.31262 -0.27010 -3.36928
0.00000 0.00000 0.00000 -4.32428 -0.28359
0.00000 0.00000 0.00000 0.00000 1.25801
>> eig(A)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
As you can see. On the diagonal of matrix $R$, we can see that it has the same eigenvalues as the eigenvalues above, but $R$ does not show the complex eigenvalues. The more iteration I do, the better result I will get. But not for the complex eigenvalues.
So is there possible to find the complex eigenvalues with QR?
eigenvalues-eigenvectors numerical-linear-algebra
eigenvalues-eigenvectors numerical-linear-algebra
asked Jan 14 at 1:47
Daniel MårtenssonDaniel Mårtensson
984419
984419
$begingroup$
I believe the double shift algorithm exists for qr iteration to find complex eigenvalues. Not recalling why the original doesn't find it
$endgroup$
– TrostAft
Jan 14 at 1:54
$begingroup$
Is there another way to find these? I can use shur to find all eigenvalues, even if they are complex. But shur will only show the real part of the complex parts.
$endgroup$
– Daniel Mårtensson
Jan 14 at 15:28
$begingroup$
The schur() function produces a "quasi-triangular" matrix with 2x2 blocks on the diagonal corresponding to complex conjugate pairs of eigenvalues. If you apply a random complex unitary similarity transformation to the matrix before calling schur() on the matrix, then the schur() function will return an upper triangular matrix with the complex eigenvalues on the diagonal. This is a parlor trick but not very useful in practice.
$endgroup$
– Brian Borchers
Jan 17 at 0:39
add a comment |
$begingroup$
I believe the double shift algorithm exists for qr iteration to find complex eigenvalues. Not recalling why the original doesn't find it
$endgroup$
– TrostAft
Jan 14 at 1:54
$begingroup$
Is there another way to find these? I can use shur to find all eigenvalues, even if they are complex. But shur will only show the real part of the complex parts.
$endgroup$
– Daniel Mårtensson
Jan 14 at 15:28
$begingroup$
The schur() function produces a "quasi-triangular" matrix with 2x2 blocks on the diagonal corresponding to complex conjugate pairs of eigenvalues. If you apply a random complex unitary similarity transformation to the matrix before calling schur() on the matrix, then the schur() function will return an upper triangular matrix with the complex eigenvalues on the diagonal. This is a parlor trick but not very useful in practice.
$endgroup$
– Brian Borchers
Jan 17 at 0:39
$begingroup$
I believe the double shift algorithm exists for qr iteration to find complex eigenvalues. Not recalling why the original doesn't find it
$endgroup$
– TrostAft
Jan 14 at 1:54
$begingroup$
I believe the double shift algorithm exists for qr iteration to find complex eigenvalues. Not recalling why the original doesn't find it
$endgroup$
– TrostAft
Jan 14 at 1:54
$begingroup$
Is there another way to find these? I can use shur to find all eigenvalues, even if they are complex. But shur will only show the real part of the complex parts.
$endgroup$
– Daniel Mårtensson
Jan 14 at 15:28
$begingroup$
Is there another way to find these? I can use shur to find all eigenvalues, even if they are complex. But shur will only show the real part of the complex parts.
$endgroup$
– Daniel Mårtensson
Jan 14 at 15:28
$begingroup$
The schur() function produces a "quasi-triangular" matrix with 2x2 blocks on the diagonal corresponding to complex conjugate pairs of eigenvalues. If you apply a random complex unitary similarity transformation to the matrix before calling schur() on the matrix, then the schur() function will return an upper triangular matrix with the complex eigenvalues on the diagonal. This is a parlor trick but not very useful in practice.
$endgroup$
– Brian Borchers
Jan 17 at 0:39
$begingroup$
The schur() function produces a "quasi-triangular" matrix with 2x2 blocks on the diagonal corresponding to complex conjugate pairs of eigenvalues. If you apply a random complex unitary similarity transformation to the matrix before calling schur() on the matrix, then the schur() function will return an upper triangular matrix with the complex eigenvalues on the diagonal. This is a parlor trick but not very useful in practice.
$endgroup$
– Brian Borchers
Jan 17 at 0:39
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
The algorithm that you've tried to use can't compute complex eigenvalues because the QR factorization of A will always be real and the next iteration will have a real A matrix. It is true that $A$ in this algorithm will converge (slowly) to a quasi-upper triangular real Schur matrix. The output $A$ will (by the nature of the similarity transformations) have the same eigenvalues as the input $A$, and you can recover the complex eigenvalues from the this quasi-triangular matrix.
Practical implementations are more sophisticated. The implicitly shifted QR algorithm with a double shift is one way to make this work. This is discussed in many textbooks on numerical linear algebra. I'd particularly recommend Fundamentals of Matrix Computations, 3rd ed., by David S. Watkins.
Your procedure is also incorrect in that it returns the last $R$ matrix rather than the last $A$ matrix. If you modify the procedure to return $A$, you'll find that the $A$ does converge to a quasi-triangular real Schur matrix with the correct complex eigenvalues.
The corrected algorithm is:
function S=myqr(A,k)
for i=1:k
[Q,R]=qr(A);
A=R*Q;
end
S=A;
Let's see how this works in comparison with the schur() command in MATLAB.
>> schur(A)
ans =
21.3589 -5.6678 10.0809 -2.3429 -5.0900
0 -1.9810 8.7273 -6.2583 -3.8582
0 -5.1169 -1.9810 -0.3539 -1.8999
0 0 0 1.2580 -0.3232
0 0 0 0 4.3450
>> eig(schur(A))
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
The two complex eigenvalues can be computed directly from the 2x2 block in rows 2-3, columns 2-3.
>> S=schur(A); S(2:3,2:3); eig(S(2:3,2:3))
ans =
-1.9810 + 6.6826i
-1.9810 - 6.6826i
You can get the same result using the simple-minded QR algorithm. It's easy to confirm (using eig()) that S is converging to a quasi-triangular real Schur matrix with the correct eigenvalues.
>> S=myqr(A,100)
S =
21.3589 -6.1095 9.8195 4.8184 -2.8601
0.0000 -2.1410 8.7202 3.1002 -6.5951
-0.0000 -5.1240 -1.8209 1.9923 -0.8432
0.0000 -0.0000 0.0000 4.3450 -0.3232
0.0000 -0.0000 0.0000 0.0000 1.2580
>> eig(S)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
4.3450 + 0.0000i
1.2580 + 0.0000i
$endgroup$
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3072758%2fis-it-possible-to-find-complex-eigenvalues-with-qr-decomposition%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
The algorithm that you've tried to use can't compute complex eigenvalues because the QR factorization of A will always be real and the next iteration will have a real A matrix. It is true that $A$ in this algorithm will converge (slowly) to a quasi-upper triangular real Schur matrix. The output $A$ will (by the nature of the similarity transformations) have the same eigenvalues as the input $A$, and you can recover the complex eigenvalues from the this quasi-triangular matrix.
Practical implementations are more sophisticated. The implicitly shifted QR algorithm with a double shift is one way to make this work. This is discussed in many textbooks on numerical linear algebra. I'd particularly recommend Fundamentals of Matrix Computations, 3rd ed., by David S. Watkins.
Your procedure is also incorrect in that it returns the last $R$ matrix rather than the last $A$ matrix. If you modify the procedure to return $A$, you'll find that the $A$ does converge to a quasi-triangular real Schur matrix with the correct complex eigenvalues.
The corrected algorithm is:
function S=myqr(A,k)
for i=1:k
[Q,R]=qr(A);
A=R*Q;
end
S=A;
Let's see how this works in comparison with the schur() command in MATLAB.
>> schur(A)
ans =
21.3589 -5.6678 10.0809 -2.3429 -5.0900
0 -1.9810 8.7273 -6.2583 -3.8582
0 -5.1169 -1.9810 -0.3539 -1.8999
0 0 0 1.2580 -0.3232
0 0 0 0 4.3450
>> eig(schur(A))
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
The two complex eigenvalues can be computed directly from the 2x2 block in rows 2-3, columns 2-3.
>> S=schur(A); S(2:3,2:3); eig(S(2:3,2:3))
ans =
-1.9810 + 6.6826i
-1.9810 - 6.6826i
You can get the same result using the simple-minded QR algorithm. It's easy to confirm (using eig()) that S is converging to a quasi-triangular real Schur matrix with the correct eigenvalues.
>> S=myqr(A,100)
S =
21.3589 -6.1095 9.8195 4.8184 -2.8601
0.0000 -2.1410 8.7202 3.1002 -6.5951
-0.0000 -5.1240 -1.8209 1.9923 -0.8432
0.0000 -0.0000 0.0000 4.3450 -0.3232
0.0000 -0.0000 0.0000 0.0000 1.2580
>> eig(S)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
4.3450 + 0.0000i
1.2580 + 0.0000i
$endgroup$
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
add a comment |
$begingroup$
The algorithm that you've tried to use can't compute complex eigenvalues because the QR factorization of A will always be real and the next iteration will have a real A matrix. It is true that $A$ in this algorithm will converge (slowly) to a quasi-upper triangular real Schur matrix. The output $A$ will (by the nature of the similarity transformations) have the same eigenvalues as the input $A$, and you can recover the complex eigenvalues from the this quasi-triangular matrix.
Practical implementations are more sophisticated. The implicitly shifted QR algorithm with a double shift is one way to make this work. This is discussed in many textbooks on numerical linear algebra. I'd particularly recommend Fundamentals of Matrix Computations, 3rd ed., by David S. Watkins.
Your procedure is also incorrect in that it returns the last $R$ matrix rather than the last $A$ matrix. If you modify the procedure to return $A$, you'll find that the $A$ does converge to a quasi-triangular real Schur matrix with the correct complex eigenvalues.
The corrected algorithm is:
function S=myqr(A,k)
for i=1:k
[Q,R]=qr(A);
A=R*Q;
end
S=A;
Let's see how this works in comparison with the schur() command in MATLAB.
>> schur(A)
ans =
21.3589 -5.6678 10.0809 -2.3429 -5.0900
0 -1.9810 8.7273 -6.2583 -3.8582
0 -5.1169 -1.9810 -0.3539 -1.8999
0 0 0 1.2580 -0.3232
0 0 0 0 4.3450
>> eig(schur(A))
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
The two complex eigenvalues can be computed directly from the 2x2 block in rows 2-3, columns 2-3.
>> S=schur(A); S(2:3,2:3); eig(S(2:3,2:3))
ans =
-1.9810 + 6.6826i
-1.9810 - 6.6826i
You can get the same result using the simple-minded QR algorithm. It's easy to confirm (using eig()) that S is converging to a quasi-triangular real Schur matrix with the correct eigenvalues.
>> S=myqr(A,100)
S =
21.3589 -6.1095 9.8195 4.8184 -2.8601
0.0000 -2.1410 8.7202 3.1002 -6.5951
-0.0000 -5.1240 -1.8209 1.9923 -0.8432
0.0000 -0.0000 0.0000 4.3450 -0.3232
0.0000 -0.0000 0.0000 0.0000 1.2580
>> eig(S)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
4.3450 + 0.0000i
1.2580 + 0.0000i
$endgroup$
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
add a comment |
$begingroup$
The algorithm that you've tried to use can't compute complex eigenvalues because the QR factorization of A will always be real and the next iteration will have a real A matrix. It is true that $A$ in this algorithm will converge (slowly) to a quasi-upper triangular real Schur matrix. The output $A$ will (by the nature of the similarity transformations) have the same eigenvalues as the input $A$, and you can recover the complex eigenvalues from the this quasi-triangular matrix.
Practical implementations are more sophisticated. The implicitly shifted QR algorithm with a double shift is one way to make this work. This is discussed in many textbooks on numerical linear algebra. I'd particularly recommend Fundamentals of Matrix Computations, 3rd ed., by David S. Watkins.
Your procedure is also incorrect in that it returns the last $R$ matrix rather than the last $A$ matrix. If you modify the procedure to return $A$, you'll find that the $A$ does converge to a quasi-triangular real Schur matrix with the correct complex eigenvalues.
The corrected algorithm is:
function S=myqr(A,k)
for i=1:k
[Q,R]=qr(A);
A=R*Q;
end
S=A;
Let's see how this works in comparison with the schur() command in MATLAB.
>> schur(A)
ans =
21.3589 -5.6678 10.0809 -2.3429 -5.0900
0 -1.9810 8.7273 -6.2583 -3.8582
0 -5.1169 -1.9810 -0.3539 -1.8999
0 0 0 1.2580 -0.3232
0 0 0 0 4.3450
>> eig(schur(A))
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
The two complex eigenvalues can be computed directly from the 2x2 block in rows 2-3, columns 2-3.
>> S=schur(A); S(2:3,2:3); eig(S(2:3,2:3))
ans =
-1.9810 + 6.6826i
-1.9810 - 6.6826i
You can get the same result using the simple-minded QR algorithm. It's easy to confirm (using eig()) that S is converging to a quasi-triangular real Schur matrix with the correct eigenvalues.
>> S=myqr(A,100)
S =
21.3589 -6.1095 9.8195 4.8184 -2.8601
0.0000 -2.1410 8.7202 3.1002 -6.5951
-0.0000 -5.1240 -1.8209 1.9923 -0.8432
0.0000 -0.0000 0.0000 4.3450 -0.3232
0.0000 -0.0000 0.0000 0.0000 1.2580
>> eig(S)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
4.3450 + 0.0000i
1.2580 + 0.0000i
$endgroup$
The algorithm that you've tried to use can't compute complex eigenvalues because the QR factorization of A will always be real and the next iteration will have a real A matrix. It is true that $A$ in this algorithm will converge (slowly) to a quasi-upper triangular real Schur matrix. The output $A$ will (by the nature of the similarity transformations) have the same eigenvalues as the input $A$, and you can recover the complex eigenvalues from the this quasi-triangular matrix.
Practical implementations are more sophisticated. The implicitly shifted QR algorithm with a double shift is one way to make this work. This is discussed in many textbooks on numerical linear algebra. I'd particularly recommend Fundamentals of Matrix Computations, 3rd ed., by David S. Watkins.
Your procedure is also incorrect in that it returns the last $R$ matrix rather than the last $A$ matrix. If you modify the procedure to return $A$, you'll find that the $A$ does converge to a quasi-triangular real Schur matrix with the correct complex eigenvalues.
The corrected algorithm is:
function S=myqr(A,k)
for i=1:k
[Q,R]=qr(A);
A=R*Q;
end
S=A;
Let's see how this works in comparison with the schur() command in MATLAB.
>> schur(A)
ans =
21.3589 -5.6678 10.0809 -2.3429 -5.0900
0 -1.9810 8.7273 -6.2583 -3.8582
0 -5.1169 -1.9810 -0.3539 -1.8999
0 0 0 1.2580 -0.3232
0 0 0 0 4.3450
>> eig(schur(A))
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
1.2580 + 0.0000i
4.3450 + 0.0000i
The two complex eigenvalues can be computed directly from the 2x2 block in rows 2-3, columns 2-3.
>> S=schur(A); S(2:3,2:3); eig(S(2:3,2:3))
ans =
-1.9810 + 6.6826i
-1.9810 - 6.6826i
You can get the same result using the simple-minded QR algorithm. It's easy to confirm (using eig()) that S is converging to a quasi-triangular real Schur matrix with the correct eigenvalues.
>> S=myqr(A,100)
S =
21.3589 -6.1095 9.8195 4.8184 -2.8601
0.0000 -2.1410 8.7202 3.1002 -6.5951
-0.0000 -5.1240 -1.8209 1.9923 -0.8432
0.0000 -0.0000 0.0000 4.3450 -0.3232
0.0000 -0.0000 0.0000 0.0000 1.2580
>> eig(S)
ans =
21.3589 + 0.0000i
-1.9810 + 6.6826i
-1.9810 - 6.6826i
4.3450 + 0.0000i
1.2580 + 0.0000i
edited Jan 17 at 1:23
answered Jan 14 at 2:23
Brian BorchersBrian Borchers
6,17611320
6,17611320
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
add a comment |
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
Is there not an easier method to compute eigenvalues?
$endgroup$
– Daniel Mårtensson
Jan 14 at 9:04
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
See updated answer.
$endgroup$
– Brian Borchers
Jan 17 at 17:29
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
$begingroup$
Thank you. Very clear and good answer. I wish there where another way to find the complex eigenvalues.
$endgroup$
– Daniel Mårtensson
Jan 17 at 22:04
add a comment |
Thanks for contributing an answer to Mathematics Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3072758%2fis-it-possible-to-find-complex-eigenvalues-with-qr-decomposition%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
I believe the double shift algorithm exists for qr iteration to find complex eigenvalues. Not recalling why the original doesn't find it
$endgroup$
– TrostAft
Jan 14 at 1:54
$begingroup$
Is there another way to find these? I can use shur to find all eigenvalues, even if they are complex. But shur will only show the real part of the complex parts.
$endgroup$
– Daniel Mårtensson
Jan 14 at 15:28
$begingroup$
The schur() function produces a "quasi-triangular" matrix with 2x2 blocks on the diagonal corresponding to complex conjugate pairs of eigenvalues. If you apply a random complex unitary similarity transformation to the matrix before calling schur() on the matrix, then the schur() function will return an upper triangular matrix with the complex eigenvalues on the diagonal. This is a parlor trick but not very useful in practice.
$endgroup$
– Brian Borchers
Jan 17 at 0:39