📄 householder.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 + -