文档章节

Java的高斯消元法

吐槽的达达仔
 吐槽的达达仔
发布于 2014/12/05 22:17
字数 618
阅读 45
收藏 0

算法虽然会,但是用数组的形式进行求值是一件非常非常恶心的事情。

更恶心的是,公司里面的逻辑居然要用到方程组求解,万分无奈之下,上网找了一份Java代码。

谁知道居然是个算法数组从1开始的。

好吧,认了吧,我就把你改过来。

调试通过。

留个代码做纪念。

 

package com;

public class EquationSolver {

	/**
	 * @列主元高斯消去法
	 */
	static double a[][];
	static double b[];
	static double x[];
	static int n;
	static int n2; //记录换行的次数
    public static void Elimination(){  //消元
    	PrintA();
		for(int k=0;k<n;k++)
		{
			Wrap(k);
			for(int i=k+1;i<n;i++)
			{
				double l=a[i][k]/a[k][k];
				a[i][k]=0.0;
				for(int j=k+1;j<n;j++)
					a[i][j]=a[i][j]-l*a[k][j];
				b[i]=b[i]-l*b[k];
			}
			System.out.println("第"+k+"次消元后:");
			PrintA();
		}
				
	}
    public static void Back()//回代
    {
    	x[n-1]=b[n-1]/a[n-1][n-1];
    	for(int i=n-2;i>=0;i--)
    		x[i]=(b[i]-jisuan(i))/a[i][i];
    }
    public static double jisuan(int i){
    	double he=0.0;
    	for(int j=i;j<=n-1;j++)
    		he=he+x[j]*a[i][j];
    	return he;
    }
    public static void Wrap(int k){//换行
    	double max=Math.abs(a[k][k]);
    	int n1=k;                   //记住要交换的行
    	for(int i=k+1;i<n;i++)     //找到要交换的行
    	{
    		if(Math.abs(a[i][k])>max){
    			n1=i;
    			max=Math.abs(a[i][k]);
    		}
    	}
    	if(n1!=k)
    	{
    		n2++;
    	System.out.println("当k="+k+"时,要交换的行是:"+k+"和"+n1);
    	for(int j=k;j<n;j++)  //交换a的行
    	{
    		double x1;
    		x1=a[k][j];
    		a[k][j]=a[n1][j];
    		a[n1][j]=x1;
    	}
    	double b1;   //交换b的行
		b1=b[k];
		b[k]=b[n1];
		b[n1]=b1;
		System.out.println("交换后:");
		PrintA();
    	}
    }
    public static void Determinant(){//求行列式
    	double DM=1.0;
    	for(int i=0;i<n;i++)
    	{
    		double a2=a[i][i];
    	    DM=DM*a2;
    	}
    	double n3=(double)n2;
    	DM=DM*Math.pow(-1.0, n3);
    	System.out.println("该方程组的系数行列式:det A = "+DM);
    }
    public static void PrintA(){//输出增广矩阵
    	System.out.println("增广矩阵为:");
    	for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<n;j++)
    			System.out.print(a[i][j]+"    ");
    		System.out.print(b[i]+"    ");
    		System.out.print("\n");
    	}
    }
    public static void Print(){//输出方程的根
    	System.out.println("方程组的根为:");
    	for(int i=0;i<n;i++)
    		System.out.println("x"+i+" = "+x[i]);
    }
	public static void main(String[] args) {
		//Scanner as=new Scanner(System.in);
        System.out.println("输入方程组的元数:");
        //n=as.nextInt();
        n=2;
        a=new double[n][n];
        b=new double[n];
        x=new double[n];
        
        double inputA[][] = {{1,1},{1,-1}};
        a = inputA;
        
        double inputB[] = {2,0};
        b = inputB;
        
        double inputX[] = {1,1};
        
        System.out.println("输入方程组的系数矩阵a:");
//        for(int i=1;i<=n;i++)
//        	for(int j=1;j<=n;j++)
//        		a[i][j]=as.nextDouble();
        System.out.println("输入方程组矩阵b:");
//        for(int i=1;i<=n;i++)
//        	b[i]=as.nextDouble();
        Elimination();
        Back();
        Print();
        Determinant();
	}
}

 

本文转载自:http://dacoolbaby.iteye.com/blog/1818768

吐槽的达达仔
粉丝 27
博文 103
码字总数 6775
作品 0
广州
程序员
私信 提问
一言难尽:Java技术之父离开Oracle的原因

Java创始人詹姆斯·高斯林(James Gosling)9日在博客中称,已经在4月2日从甲骨文(Oracle)退休,现在还没有在别的地方任职。 高 斯林在博文中写道:“说到我为什么辞职,这是一个非常难于回答...

红薯
2010/04/12
1K
7
Java创始人高斯林声称已加盟谷歌

据国外媒体报道,Java创始人詹姆斯高斯林(James Gosling)周一发表博客文章称,他已经加入了谷歌公司。 高斯林在去年甲骨文收购Sun时离开公司。虽然当时业内并不清楚他离开的真正原因,但据...

红薯
2011/03/29
2.1K
30
数论常用内容——高斯消元

高斯消元法 数学上,高斯消元法,是线性代数中的一个算法,可用来为线性方程组求解 高斯消元法求解线性方程组时,首先需要根据方程,列出增广矩阵。然后再利用初等行变换把增广矩阵转换为行阶...

tick_tock97
2017/05/06
0
0
[Code] 收集各种语言对图片的处理算法实现 图片模糊

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.......

Qiujuer
2014/12/07
722
1
行列式求解,列主元高斯消元法

高斯消元法的弊端就是针对系数矩阵A,当遇到A(n,n)=0的情况时边无法处理(出现除0错误),以及有效减少计算机在处理浮点运算时出现舍入误差。 列主消元法代码: function [x]=ext_gauss(A,b...

quanwei9958
2015/09/05
711
0

没有更多内容

加载失败,请刷新页面

加载更多

如何设计抗住100亿次请求的抢红包系统?(附GitHub代码)

1. 前言 前几天,偶然看到了 《扛住100亿次请求——如何做一个“有把握”的春晚红包系统”》一文,看完以后,感慨良多,收益很多。 正所谓他山之石,可以攻玉,虽然此文发表于2015年,我看到...

Java程序员之家
37分钟前
3
0
动图+源码,演示Java中常用数据结构执行过程及原理

最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList LinkedHashMap中的双向...

Java技术剑
今天
4
0
怎样在ps中制作对话气泡?一招教你轻松解决

PS是在工作中经常使用的平面设计软件,利用ps可以实现很多操作。换天,换发色,添加亮灯等操作都是比较常见的,今天将为大家分享怎样在ps中制作对话气泡的方法,希望能给大家带来帮助。 绘制...

干货趣分享
今天
2
0
EDI 电子数据交换全解指南

EDI(Electronic Data Interchange,电子数据交换)技术使得企业与企业(B2B)实现通信自动化,帮助交易伙伴和组织更快更好地完成更多工作,并消除了人工操作带来的错误。从零售商到制造商、物...

EDI知行软件
今天
3
0
CentOS7的LVM动态扩容

# 问题 CentOS7上面的磁盘空间有点紧张,需要扩容。 解决 查询当前磁盘状态 [root@xxx ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTfd0 2:0 1 4K ...

亚林瓜子
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部