求解 Java 中的矩阵方程
Solving a matrix equation in Java
我一直在尝试在 JAVA 中实现给定的公式,但我没有成功。有人可以帮我找到我做错了什么吗?
我是否需要移动求和索引,如果需要如何移动?
我的代码:
public final class LinearSystem {
private LinearSystem() {
}
public static int[] solve(int [][]A , int []y) {
int n = A.length;
int[] x = new int[n];
for (int i = 0 ; i < n; i++) {
x[i] = 0;
int sum = 0;
for(int k = i + 1 ; k == n; k++) {
sum += A[i][k]*x[k]; // **java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3**
}
x[i] = 1/A[i][i] * (y[i] - sum);
}
return x;
}
public static void main(String[] args) {
int[][]A = new int[][]{{2,-1,-3},{0,4,-1},{0,0,3}};
int [] y = new int[] {4,-1,23};
System.out.println(Arrays.toString(solve(A,y))); **// awaited result [2, -3, 1]**
}
}
请记住,数组是从 0 开始索引的,因此最后一个元素位于索引 n - 1
,而不是 n
。
首先,您需要进行第二个循环直到 k < n,否则会抛出 ArrayOutOfBounds 异常。
其次,您需要按照@Dawood ibn Kareem 所说的相反顺序计算您的 x
。
此外,您可能希望 x[] 成为一个 double-array 不仅得到 0 值作为结果。
很抱歉,我对数学方面了解不多,所以我无法将其修复为正确的解决方案,但我注意到您的代码有一些错误。
1-您不应将数组初始化为整数数组,因为您将在所有地方进行整数除法。例如 1/A[i][i] 将导致 0 即使 A[i][i] = 2
2-你不应该写 k == n,如果你这样做那么你的 for 循环只会在 k 等于 n 时执行,这对你的情况来说是不可能的。
我想你想做 k < n,从 i+1 循环到 k = n - 1
这是我的代码:
import java.util.Arrays;
public final class LinearSystem {
private LinearSystem() {
}
public static double[] solve(double [][]A , double []y) {
int n = A.length;
double[] x = new double[n];
for (int i = 0 ; i < n; i++) {
x[i] = 0;
int sum = 0;
for(int k = i + 1 ; k < n; k++) {
sum += A[i][k] * x[k]; // **java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3**
}
x[i] = 1/A[i][i] * (y[i] - sum);
}
return x;
}
public static void main(String[] args) {
double[][]A = new double[][]{{2,-1,-3},{0,4,-1},{0,0,3}};
double [] y = new double[] {4,-1,23};
System.out.println(Arrays.toString(solve(A,y))); // awaited result [2, -3, 1]**
}
}
只是想把我在这个问题下的所有评论收集成一个连贯的答案,因为你的程序中有很多不同的错误。
这种求解线性方程的方法依赖于您以相反的顺序计算答案的组成部分 - 即从下到上。这是因为每个 x[i]
值都取决于向量中下方 的值,而不是上方 的值。所以你的外循环,你迭代 x
值需要从最大的索引开始,并向下工作到最小的。换句话说,不是 for (int i = 0; i < n; i++)
,而是 for (int i = n - 1; i >= 0; i++)
.
内循环停止条件错误。对于for
循环,两个分号之间的部分是继续迭代的条件,而不是停止的条件。因此,您需要 for(int k = i + 1; k < n; k++)
.
而不是 for(int k = i + 1; k == n; k++)
您在 1 / A[i][i] * (y[i] - sum);
的开头进行整数除法,这意味着在继续之前将值四舍五入为整数。当您将 1
除以另一个整数时,由于四舍五入,您总是会得到 -1
、0
或 1
,这会使您的答案不正确。下面第 4 点的修复将解决这个问题。
该公式依赖于使用浮点类型或小数类型所带来的数学准确性。整数不会准确。所以你需要改变你的一些变量的声明,如下所示。
public static double[] solve(double[][] A, double[] y)
double x[] = new double[n];
double sum = 0.0;
随着 main
方法的相应变化。
我一直在尝试在 JAVA 中实现给定的公式,但我没有成功。有人可以帮我找到我做错了什么吗? 我是否需要移动求和索引,如果需要如何移动?
我的代码:
public final class LinearSystem {
private LinearSystem() {
}
public static int[] solve(int [][]A , int []y) {
int n = A.length;
int[] x = new int[n];
for (int i = 0 ; i < n; i++) {
x[i] = 0;
int sum = 0;
for(int k = i + 1 ; k == n; k++) {
sum += A[i][k]*x[k]; // **java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3**
}
x[i] = 1/A[i][i] * (y[i] - sum);
}
return x;
}
public static void main(String[] args) {
int[][]A = new int[][]{{2,-1,-3},{0,4,-1},{0,0,3}};
int [] y = new int[] {4,-1,23};
System.out.println(Arrays.toString(solve(A,y))); **// awaited result [2, -3, 1]**
}
}
请记住,数组是从 0 开始索引的,因此最后一个元素位于索引 n - 1
,而不是 n
。
首先,您需要进行第二个循环直到 k < n,否则会抛出 ArrayOutOfBounds 异常。
其次,您需要按照@Dawood ibn Kareem 所说的相反顺序计算您的 x
。
此外,您可能希望 x[] 成为一个 double-array 不仅得到 0 值作为结果。
很抱歉,我对数学方面了解不多,所以我无法将其修复为正确的解决方案,但我注意到您的代码有一些错误。
1-您不应将数组初始化为整数数组,因为您将在所有地方进行整数除法。例如 1/A[i][i] 将导致 0 即使 A[i][i] = 2
2-你不应该写 k == n,如果你这样做那么你的 for 循环只会在 k 等于 n 时执行,这对你的情况来说是不可能的。 我想你想做 k < n,从 i+1 循环到 k = n - 1
这是我的代码:
import java.util.Arrays;
public final class LinearSystem {
private LinearSystem() {
}
public static double[] solve(double [][]A , double []y) {
int n = A.length;
double[] x = new double[n];
for (int i = 0 ; i < n; i++) {
x[i] = 0;
int sum = 0;
for(int k = i + 1 ; k < n; k++) {
sum += A[i][k] * x[k]; // **java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3**
}
x[i] = 1/A[i][i] * (y[i] - sum);
}
return x;
}
public static void main(String[] args) {
double[][]A = new double[][]{{2,-1,-3},{0,4,-1},{0,0,3}};
double [] y = new double[] {4,-1,23};
System.out.println(Arrays.toString(solve(A,y))); // awaited result [2, -3, 1]**
}
}
只是想把我在这个问题下的所有评论收集成一个连贯的答案,因为你的程序中有很多不同的错误。
这种求解线性方程的方法依赖于您以相反的顺序计算答案的组成部分 - 即从下到上。这是因为每个
x[i]
值都取决于向量中下方 的值,而不是上方 的值。所以你的外循环,你迭代x
值需要从最大的索引开始,并向下工作到最小的。换句话说,不是for (int i = 0; i < n; i++)
,而是for (int i = n - 1; i >= 0; i++)
.内循环停止条件错误。对于
而不是for
循环,两个分号之间的部分是继续迭代的条件,而不是停止的条件。因此,您需要for(int k = i + 1; k < n; k++)
.for(int k = i + 1; k == n; k++)
您在
1 / A[i][i] * (y[i] - sum);
的开头进行整数除法,这意味着在继续之前将值四舍五入为整数。当您将1
除以另一个整数时,由于四舍五入,您总是会得到-1
、0
或1
,这会使您的答案不正确。下面第 4 点的修复将解决这个问题。该公式依赖于使用浮点类型或小数类型所带来的数学准确性。整数不会准确。所以你需要改变你的一些变量的声明,如下所示。
public static double[] solve(double[][] A, double[] y)
double x[] = new double[n];
double sum = 0.0;
随着 main
方法的相应变化。