如何使用 Java 求解 2x2 矩阵的特征向量

How to solve for eigenvectors of a 2x2 Matrix using Java

我正在尝试求解 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 的平方根。我能做到这一点。但是,一旦我尝试计算特征向量,我就没有得到特征向量的值。

**编辑:我添加了错误并删除了之前卡住的无限循环 **

根据您的编辑意见,我认为修改后的代码应该会产生您想要的结果。我已经删除了您的临时变量,并将您的计算基值作为 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)

无需通过试错循环求解特征向量的线性系统。

等式

(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 + ")");