📄 linearequationgrouptest.java
字号:
package numericalAnalysis.linearEquationGroup;
import java.util.Scanner;
public class LinearEquationGroupTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
LinearEquationGroup er;// 线性方程组
int n;// 未知数个数
double a[][];// 系数矩阵
double b[];// 等式右边常数
double errAllowed;// 迭代法要用的允许误差
double[] xIni;// 迭代法要用的初始值
double factorOfRelaxation;// 松弛因子
String another;// 新建一个方程组的判断
System.out.println("\n----------------------------本程序求解一个线性方程组"
+ "----------------------------\n");
System.out.println("输入1求解方程个数与未知数个数相等的方程组,输入2求解过定方程组:");
if(input.nextInt()==2){
// 输入方程组
System.out.println("\n输入未知数个数:");
n = input.nextInt();
System.out.println("\n输入过定方程组所含方程个数:");
int numberOfEq=input.nextInt();
a = new double[numberOfEq + 1][n + 1];// 不使用0下标
b = new double[numberOfEq + 1];
System.out.println("\n从左到右,从上到下,输入系数矩阵(使用空格分开每个元素):");
for (int i = 1; i < numberOfEq + 1; i++)
for (int j = 1; j < n + 1; j++)
a[i][j] = input.nextDouble();
System.out.println("\n从上到下,输入等式右边的列向量即b1,b2,...,bn(使用空格分开每个元素):");
for (int i = 1; i < numberOfEq + 1; i++)
b[i] = input.nextDouble();
er = new LinearEquationGroup(n, a, b);
System.out.println("\n\n输入的过定方程组为:");
System.out.println(er.print());
System.out.println("\n\n解:");
System.out.println(er.overdetermined());
} else{
do {
// 输入方程组
System.out.println("\n输入未知数个数:");
n = input.nextInt();
a = new double[n + 1][n + 1];// 不使用0下标
b = new double[n + 1];
System.out.println("\n从左到右,从上到下,输入系数矩阵(使用空格分开每个元素):");
for (int i = 1; i < n + 1; i++)
for (int j = 1; j < n + 1; j++)
a[i][j] = input.nextDouble();
System.out.println("\n从上到下,输入等式右边的列向量即b1,b2,...,bn(使用空格分开每个元素):");
for (int i = 1; i < n + 1; i++)
b[i] = input.nextDouble();
er = new LinearEquationGroup(n, a, b);
// 确认
System.out.println("\n输入的方程组是:");
System.out.println(er.print());
String anotherChoice;
do {
int choice = 0;
boolean retry = true;
while (retry) {
retry = false;
System.out.println();
System.out.println("1---高斯消元法");
System.out.println("2---克劳特消元法");
System.out.println("3---平方根消元法");
System.out.println("4---追赶法(对称方程组专用)");
System.out.println("5---列主元素消元法");
System.out.println("6---雅可比迭代法");
System.out.println("7---高斯-赛德尔迭代法");
System.out.println("8---松弛迭代法");
System.out.println("请选择:");
try {
choice = Integer.parseInt(input.next());
} catch (NumberFormatException e) {
System.out.println("请别胡乱输入!\n");
retry = true;
}
if (retry == false && (choice < 1 || choice > 8)) {
System.out.println("请别胡乱输入!\n");
retry = true;
}
}
switch (choice) {
case 1: {
System.out.println("\n\n高斯消元法:");
System.out.println(er.gaussElimination());
break;
}
case 2: {
System.out.println("\n\n克劳特消元法:");
System.out.println(er.croutElimination());
break;
}
case 3: {
System.out.println("\n\n平方根消元法:");
System.out.println(er.cholesky());
break;
}
case 4: {
System.out.println("\n\n追赶法:");
System.out.println(er.chase());
break;
}
case 5: {
System.out.println("\n\n列主元素消元法:");
System.out.println(er.mainElementOfColumns());
break;
}
case 6: {
errAllowed = 0;
xIni = new double[n + 1];
System.out.println("\n\n现在使用雅可比迭代法.输入允许误差:");
errAllowed = input.nextDouble();
System.out.println("\n从 x1 到 x" + n + ",输入初值(空格分开):");
for (int i = 1; i < n + 1; i++)
xIni[i] = input.nextDouble();
System.out.println(er.jacobiIterative(errAllowed, xIni));
break;
}
case 7: {
errAllowed = 0;
xIni = new double[n + 1];
System.out.println("\n\n现在使用高斯-赛德尔迭代法.输入允许误差:");
errAllowed = input.nextDouble();
System.out.println("\n从 x1 到 x" + n + ",输入初值(空格分开):");
for (int i = 1; i < n + 1; i++)
xIni[i] = input.nextDouble();
System.out.println(er
.gaussSeidelIterative(errAllowed, xIni));
break;
}
case 8: {
factorOfRelaxation = 1;
System.out.println("\n\n现在使用松弛迭代法.输入允许误差:");
errAllowed = input.nextDouble();
xIni = new double[n + 1];
System.out.println("\n从 x1 到 x" + n + ",输入初值(空格分开):");
for (int i = 1; i < n + 1; i++)
xIni[i] = input.nextDouble();
System.out.println("输入松弛因子:");
factorOfRelaxation = input.nextDouble();
System.out.println(er.relaxationIterative(errAllowed, xIni,
factorOfRelaxation));
break;
}
}
System.out.println(" 要再使用其它方法吗? y/n:");
anotherChoice = input.next();
} while (anotherChoice.equalsIgnoreCase("y"));
System.out.println("\n 输入另一个线性方程组? y/n:");
another = input.next();
} while (another.equalsIgnoreCase("y"));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -