⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 householder.txt

📁 豪斯霍尔德解线性最小二乘,简单易行
💻 TXT
字号:
public class Leasttg {
	private static void Householder(int n, int m, double[][] a, double[] x,
			double[] y) {
		// 声明 a 为(m*n)矩阵的增广矩阵
		System.out.println("请输入参数x:");
		for (int d = 0; d < m; d++) {

			System.out.println("第 " + (d + 1) + " 行的x参数");
			x[d] = SavitchIn.readLineDouble();

		}
		for (int d = 0; d < m; d++) {
			System.out.println("第 " + (d + 1) + " 行的y参数");
			y[d] = SavitchIn.readLineDouble();
		}
		for (int d = 0; d < m; d++) {
			for (int c = 0; c < n + 1; c++) {
				if (c == 0) {
					a[d][c] = 1;
				} else if (c == n) {
					a[d][c] = y[d];
				} else
					a[d][c] = Math.pow(x[d], 2);
			}
		}
		// 显示矩阵;
		System.out.println("您输入的矩阵为");
		for (int d = 0; d < m; d++) {
			for (int c = 0; c < n + 1; c++) {
				System.out.print(a[d][c] + " ");
			}
			System.out.println();
		}
		double[] fs = new double[n];
		int j = 0;
		double[] v = new double[m];
		double[] e = new double[m];
		double[] t = new double[m];
		double[] bk = new double[m];// bk=v*v^
		for (j = 0; j < m; j++) {
			bk[j] = 0;
		}
		for (int i = 0; i < n; i++) {
			double temp = 0;
			double r = 0;
			for (int s = 0; s < m; s++) {
				v[s] = 0;// 记录豪斯霍尔德向量
			}
			for (int s = 0; s < m; s++) {
				e[s] = 0;
			}
			for (int s = 0; s < m; s++) {
				t[s] = 0;
			}
			// 计算当前列的2范数(避免抵消判定)
			if (a[i][i] > 0) {
				for (j = i; j < m; j++) {
					temp += Math.pow(a[j][i], 2);
				}
				fs[i] = (-1) * (Math.pow(temp, 0.5));
			} else {
				for (j = i; j < m; j++) {
					temp += Math.pow(a[j][i], 2);
				}
				fs[i] = Math.pow(temp, 0.5);
			}
			// 显示计算过程
			//System.out.println("豪斯霍尔德向量 " + (i + 1) + " 是 " + fs[i]);
			for (j = 0; j < m; j++) {
				if (j < i)
					t[j] = 0;
				else
					t[j] = a[j][i];
			}
			for (j = 0; j < m; j++) {
				if (j == i)
					e[j] = fs[i];
				else
					e[j] = 0;
			}
			for (j = 0; j < m; j++) {
				v[j] = t[j] - e[j];
			}
			/*for (j = 0; j < m; j++) {
				System.out.print("|" + v[j] + " \n");
			}*/
			System.out.println();
			for (j = 0; j < m; j++) {
				bk[i] += v[j] * v[j];
			}
			// System.out.println("bk" + i + " 是 " + bk[i]);
			if (bk[i] == 0)
				continue;// 如果当前列已为0,跳过
			// 对剩余的子矩阵做变换
			for (j = i; j < n + 1; j++) {
				r = 0;
				for (int q = 0; q < m; q++) {
					r = r + (v[q] * a[q][j]);
				}
				// System.out.println("r=" + r);
				for (int q = 0; q < m; q++) {
					double t1 = 2 * r;
					double t2 = t1 / bk[i];
					double t3 = t2 * v[q];
				//	System.out.print("|" + a[q][j]);
					a[q][j] -= t3;

				//	System.out.print("|" + a[q][j]);
				//	System.out.println();
				}
			//	System.out.println();
			}
			for (int d = 0; d < m; d++) {
				for (int c = 0; c < n + 1; c++) {
			//		System.out.print(a[d][c] + " ");
				}
			//	System.out.println();
			}
			System.out.println("_________________________________________________________________");
		}
	}

	public static void main(String args[]) {
		int n, m;
		System.out.println("请输入参数个数(即n):");
		n = SavitchIn.readLineInt();
		System.out.println("请输入测量数据个数(即m):");
		m = SavitchIn.readLineInt();
		double[][] a = new double[m][n + 1];
		double[] x = new double[m];
		double[] y = new double[m];
		Householder(n, m, a, x, y);
		// 用回代法求解方程组
		double[] resoult = new double[n];
		int j;
		resoult[n - 1] = a[n - 1][n] / a[n - 1][n - 1];
		for (int h = n - 2; h >= 0; h--) {
			for (j = n - 2; j >= h; j--) {
				a[h][n] -= resoult[j + 1] * a[h][j + 1];
			}
			resoult[h] = a[h][n] / a[h][h];
		}

		System.out.println("程序运行结果为");
		System.out.println("a : " + resoult[0]);
		System.out.println("b : " + resoult[1]);
		// 比较,求误差
		System.out.println("下面显示的是给定的y值");
		for (int q = 0; q < m; q++) {

			System.out.print(y[q] + "  ");
		}
		System.out.println();
		double[] yy = new double[m];
		for (int q = 0; q < m; q++) {
			yy[q] = resoult[0] + resoult[1] * Math.pow(x[q], 2);
		}
		double[] cha = new double[m];
		for (int q = 0; q < m; q++) {
			cha[q] = y[q] - yy[q];
		}
		System.out.println("误差y-y*如下所示:");
		for (int q = 0; q < m; q++) {
			System.out.println("y值 " + (q + 1) + " 的误差是:" + cha[q]);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -