用幂法求矩阵的最大近似特征值 (JAVA)

一.       算法设计

1. 幂法

(1)取初始向量u(例如取u=(1,1,…1)),置精度要求,置k=1.

(2)计算

v=Au, m=max(v), u= v/ m

(3)若| m-m|<,则停止计算(m作为绝对值最大特征值,u作为相应的特征向量)否则置k=k+1,转(2)

2.反幂法

(1)取初始向量u(例如取u=(1,1,…1)),置精度要求,置k=1. 

(2)对A作LU分解,即A=LU

(3)解线性方程组    Ly=u,Uv=y

(4)计算

             m=max(v), u= v/ m

(5)若|m-m|<,则停止计算(1/m作为绝对值最小特征值,u作为相应的特征向量);否则置k=k+1,转(3).

/*
 * JAVA   幂法求解矩阵特征值及特征向量 
 * a[][] 矩阵
 * v[]  初始向量
 * m: 初始向量中绝对值的最大值
 * e: 精度 
 */

import java.util.Scanner;

public class MI {

	static double a[][];
	static double v[];
	static double u[];
	static int n = 0;
	static double m;
	static double e = 0;

	public static void main(String[] args) {

		getA();
		jisuan();

	}

	private static void jisuan() {

		for (int i = 0; i < n; i++) {
			u[i] = v[i];
		}
		System.out.println("幂法所得结果:");
		for (int k = 0; k < 10; k++) { // 迭代步数

			for (int i = 0; i < n; i++) {

				v[i] = 0; // 每次相乘后置v[i]=0;
				for (int j = 0; j < n; j++) {

					v[i] = v[i] + a[i][j] * u[j];

					m = maximal(v);

				}
				u[i] = v[i] / m;

				System.out.print(u[i] + "   ");
			}

			System.out.print("     " + m);
			System.out.println();
		}

	}

	private static void getA() {
		Scanner as = new Scanner(System.in);
		System.out.print("输入方程组的元数:");
		n = as.nextInt();
		a = new double[n][n];
		v = new double[n];

		u = new double[n];
		System.out.println("输入方程组的系数矩阵a:");
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				a[i][j] = as.nextDouble();
		System.out.println("输入初始向量v:");
		for (int i = 0; i < n; i++) {
			v[i] = as.nextDouble();
		}

		System.out.println("输入精度10^(-e):");
		e = as.nextDouble();

	}

	private static double maximal(double[] v) {
		double max = 0.0;
		for (int i = 0; i < n; i++) {
			if (Math.abs(v[i]) >= max) {
				max = Math.abs(v[i]);
			}
		}
		return max;

	}

}



你可能感兴趣的:(JAVA+数据结构)