博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gauss消去法和主元素消去法的Java实现
阅读量:3968 次
发布时间:2019-05-24

本文共 2720 字,大约阅读时间需要 9 分钟。


本人是个新手,写下博客用于自我复习、自我总结。

如有错误之处,请各位大佬指出。


题目:

在这里插入图片描述
分别用Gauss消去法和主元素消去法解方程组

(要求用具有舍入的4位数进行运算),并将所得结果与具有四位有较数字的准确解进行比较。

import java.math.BigDecimal;import java.util.Scanner;//@author zsx//例题输入数据://0.001 2.000 3.000 1.000 -1.000 3.712 4.623 2.000 -2.000 1.072 5.643 3.000//本程序只能解决指定问题(直接法解方程组)public class DirectMethod {
public static void main(String args[]) {
int number=0; //记录阶数 double equation[][];//记录方程组的矩阵 System.out.println("输入阶数n:(n元一次方程组)"); Scanner sc = new Scanner(System.in); number = sc.nextInt(); equation=new double[number][number+1];//根据阶数建立方程组 try {
System.out.println("请按行列输入各未知数的系数以及常数项(如果未知数前系数为0,也请描述出来)"); System.out.println("输入顺序:x1,x2,x3,常数项(放在等号右边的常数项)"); for(int x=0;x
=0;x--) {
//每次循环都让result等于常数项 result=equation[x][n]; for(int y=n;y>x;y--) {
if(y-1==x) {
//如果运行到了 未知数*系数 = 常数项 的时候 result=result/equation[x][y-1]; } else {
//如果运行到了 未知数*系数 + 已求解的未知数*系数 = 常数项 的时候 result=result-(equation[x][y-1]*X[y-1]); } } X[x]=result; //记录求解出来的x值 //为方便浏览,以及根据题中要求,选择保留5位小数 BigDecimal b = new BigDecimal(result); result = b.setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue(); //去掉小数中的科学计数法形式: BigDecimal bg=new BigDecimal(result+""); System.out.println("x"+(x+1)+"="+bg); } } //主元素消去法 public static void mainElementsElimination(double equation[][],int n) {
double mul=0;//求上三角矩阵中的倍数关系 double result=0;//记录x1,x2,x3..xn的结果 double dbChange=0;//用于给矩阵中的数据 交换数据 int inChange=0;//用于给x1,x2,x3的位置 交换数据 int maxX=1,maxY=1; //记录最大的横纵坐标 double X[]= new double[n+1]; //用数组来记录x1,x2,x3..xn的结果 int num[]=new int[n+1]; //用来记录调换顺序后的x //默认顺序 x1,x2,x3.... for(int a=0;a
equation[maxX][maxY]){
maxX=x1; maxY=y1; } } } //根据找到的横纵坐标,对当前区域矩阵开始换位 //如果横坐标或者纵坐标是在目前区域的第一行/第一列,那么就不用调换相应行/列的位置 if(maxX!=x){
//如果横坐标不是目前区域的第一行 //上下方向调换位置 for(int y2=x;y2
=0;x--) {
//每次循环都让result等于常数项 result=equation[x][n]; for(int y=n;y>x;y--) {
if(y-1==x) {
//如果运行到了 未知数*系数 = 常数项 的时候 result=result/equation[x][y-1]; } else {
//如果运行到了 未知数*系数 + 已求解的未知数*系数 = 常数项 的时候 result=result-(equation[x][y-1]*X[y-1]); } } X[x]=result; //记录求解出来的x值 //为方便浏览,以及根据题中要求,选择保留5位小数 BigDecimal b = new BigDecimal(result); result = b.setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue(); //去掉小数中的科学计数法形式: BigDecimal bg=new BigDecimal(result+""); System.out.println("x"+(x+1)+"="+bg); } }}

输入和输出结果:

在这里插入图片描述

如果您有幸看到本文章,请注意,本段代码仍有很多问题亟待解决。
①本段代码只适用于这道题,目前没有测试更多阶数的数据时,能否输出正确结果。
②本段代码只适用于解线性方程组!
③本段代码过于冗长难懂,我自己在写的时候就算想到加注释,也无法让我感到清晰易懂(我相信各位有经验的程序员更无法理解了)。所以如果您有更好的办法去实现,或者更好的建议来修改,我会仔细斟酌并努力学习。

转载地址:http://xxyki.baihongyu.com/

你可能感兴趣的文章
libreoffice/openoffice c/c++转换office格式为pdf
查看>>
Tomcat 7.0 64位免安装解压版 安装及配置
查看>>
Android 网络编程 初级入门(一)
查看>>
No enclosing instance of type Demo06 is accessible.
查看>>
计算机发展中的两大“杀手”
查看>>
《奔跑吧,兄弟》之王祖蓝的"钥匙配箱子"概率统计问题--->>回眸
查看>>
MDK5(Keil for ARM) 工程建立时遇到的问题集锦
查看>>
(正则表达式)邮件地址爬虫
查看>>
c 编译器及#define和typedef
查看>>
Ubuntu下安装GTK+及Glade开发C应用界面
查看>>
Linux下安装eclipse并配置环境变量
查看>>
assertion 'GTK_IS_WIDGET (widget)' failed的解决办法
查看>>
Ubuntu登录管理员账户时,输入密码后一直在登录界面循环
查看>>
Linux下的定时器以及POSIX定时器:timer_settime()
查看>>
POSIX定时器timer_create()以及线程中的gettid() 和pthread_self()
查看>>
c /c++中日期和时间的获取:strftime()函数
查看>>
C语言 回调函数
查看>>
c语言swap(a,b)值交换的4种实现方法
查看>>
c 排序 汇总
查看>>
C 二维数组的动态申请与释放
查看>>