我试图解决2x2矩阵的特征向量。到目前为止,我只考虑其特征向量和特征值也是实数的真实矩阵。我目前在解决特征向量方面存在问题。
这是我到目前为止所做的:
public double[] getBasis(double[][] basis){
double a = basis[0][0];
double b = basis[0][1];
double c = basis[1][0];
double d = basis[1][1];
double eigenvalue1 = ((a+d) + Math.sqrt( Math.pow(a-d,2) + 4*b*c))/2;
double eigenvalue2 = ((a+d) - Math.sqrt( Math.pow(a-d,2) + 4*b*c))/2;
double tempx;
double tempy;
int counter = 1;
for (double y = -1000; y <= 1000; y++) {
for (double x = -1000; x <= 1000; x++) {
if (((a-eigenvalue1)*x + b*y == 0) && (c*x + (d-eigenvalue1)*y == 0)) {
tempx = x;
tempy = y;
System.out.println("Eigenvector1: (" + x + "," + y + ")");
System.out.println("Eigenvalue1: "+ eigenvalue1);
}
}
}
for (double y = -10; y <= 10; y++) {
for (double x = -10; x <= 10; x++) {
if (((a-eigenvalue2)*x + b*y == 0) && (c*x + (d-eigenvalue2)*y == 0)) {
tempx = x;
tempy = y;
System.out.println("Eigenvector2: (" + x + "," + y + ")");
System.out.println("Eigenvalue2: " + eigenvalue2);
}
}
}return eigenvector1;
}
}
这个方法应该有一个2x2数组的输入,我希望它输出两个标准化的特征向量。我怎样才能输出两个特征向量?另外,我不允许使用任何可以求解特征向量或值的包。基本的数学和算术是完全可以接受的。
Output:
Eigenvector1: (0.0,0.0)
Eigenvector1: (1.0,1.0)
Eigenvector1: (2.0,2.0)
Eigenvector1: (3.0,3.0)
Eigenvector1: (4.0,4.0)
Eigenvector1: (5.0,5.0)
Eigenvector1: (6.0,6.0)
Eigenvector1: (7.0,7.0)
Eigenvector1: (8.0,8.0)
Eigenvector1: (9.0,9.0)
Eigenvector1: (10.0,10.0)
Eigenvector2: (0.0,0.0)
如何才能为特征向量1和特征向量2选择一个向量。另外,如果矩阵有输入(1,1,1,-1),使得它是2x2矩阵,那么特征值应该是积极和消极的平方根2.我能够走得那么远。但是,一旦我尝试计算特征向量,我就不会得到特征向量的值。
**编辑:我添加了错误并取出了之前被卡住的无限循环 **
答案 0 :(得分:1)
没有必要通过反复试验来解决特征向量的线性系统。
等式
(a-e)*x+b*y == 0
始终是解决方案
x = b, y = -(a-e)
然后你必须规范化。您需要检查第一个等式是否具有全零系数,然后您必须使用第二个等式
c*x + (d-e)*y == 0
解决方案
x = -(d-e), y = c
如果第二个方程也具有全零系数,那么任何向量都是一个特征向量,因为矩阵是对角矩阵diag([e,e])。
这应该会产生一些像
这样的代码e = eigenvalue1;
x = b; y = e-a;
r = Math.sqrt(x*x+y*y)
if( r > 0) { x /= r; y /= r; }
else {
x = e-d; y = c;
r = sqrt(x*x+y*y)
if( r > 0) { x /= r; y /= r; }
else {
x = 1; y = 0;
}
}
System.out.println("Eigenvector1: (" + x + "," + y + ")");
e = eigenvalue2;
x = b; y = e-a;
r = Math.sqrt(x*x+y*y)
if( r > 0) { x /= r; y /= r; }
else {
x = e-d; y = c;
r = sqrt(x*x+y*y)
if( r > 0) { x /= r; y /= r; }
else {
x = 0; y = 1;
}
}
System.out.println("Eigenvector2: (" + x + "," + y + ")");
答案 1 :(得分:0)
根据您的编辑评论,我认为此修订后的代码应该产生您想要的内容。我删除了你的临时变量,我将你的计算基值作为2元素数组返回。对不起,如果我说错了什么,我的数学有点生锈。
public static void main(String[] args) {
// the input matrix
double[][] matrix = {
{1.0, 1.0},
{1.0, -1.0}
};
// compute the basis
double[] basis = getBasis(matrix);
System.out.println("Basis: (" + basis[0] + ", " + basis[1] + ")");
}
public double[] getBasis(double[][] matrix){
double a = matrix[0][0];
double b = matrix[0][1];
double c = matrix[1][0];
double d = matrix[1][1];
double eigenvalue1 = ((a+d) + Math.sqrt( Math.pow(a-d,2) + 4*b*c))/2;
double eigenvalue2 = ((a+d) - Math.sqrt( Math.pow(a-d,2) + 4*b*c))/2;
// store the basis in a 2 element array
double[] basis = new double[2];
for (double y = -1000; y <= 1000; y++) {
for (double x = -1000; x <= 1000; x++) {
if (((a-eigenvalue1)*x + b*y == 0) && (c*x + (d-eigenvalue1)*y == 0)) {
System.out.println("Eigenvector1: (" + x + "," + y + ")");
basis[0] = eigenvalue1;
}
}
}
for (double y = -10; y <= 10; y++) {
for (double x = -10; x <= 10; x++) {
if (((a-eigenvalue2)*x + b*y == 0) && (c*x + (d-eigenvalue2)*y == 0)) {
System.out.println("Eigenvector2: (" + x + "," + y + ")");
basis[1] = eigenvalue2;
}
}
}
return basis;
}
输出:
Basis: (1.4142135623730951, -1.4142135623730951)