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

📄 linearequationgrouptest.java

📁 数值分析算法源码(java) 这个学期一边学习java一边学习数值分析,因此用java写了一个数值分析算法的软件包numericalAnalysis. [说明] 适合使用者:会java的
💻 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 + -