Java的高斯消元法
来源:互联网 发布:nba球员数据排名 编辑:程序博客网 时间:2024/05/01 02:54
算法虽然会,但是用数组的形式进行求值是一件非常非常恶心的事情。
更恶心的是,公司里面的逻辑居然要用到方程组求解,万分无奈之下,上网找了一份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();
- }
- }
- Java的高斯消元法
- 【Java】Java的多态性
- 【Java】java的多线程
- java的
- 动态的Java (Dynamic Java)
- java 完整的SwingUtil.java
- [Java] java里的enum
- Java Architecture [JAVA的架构]
- 【java基础】java的多态性
- java 常用的Java片段
- 【Java】Java中多态的实现
- Java:Java 队列的遍历
- 【Java】Java线程的概念
- 【Java】JAVA的StringBuffer类
- 【JAVA】Java文件的读写
- 【Java】Java栈的使用
- 【Java】Java的命令行参数
- 【Java】Java数组的初始化
- javascript 正则表达式验证表单信息(光标离开会判断是否符合规定,不符合会提示)
- 程序员轻松应对工作的秘诀
- 正则
- javascript总结
- jqGrid-colModel之自定义输入函数 自定义edittype的控件类型
- Java的高斯消元法
- const的作用
- uva 11729 - Commando War
- JAVA如何判断两天在同一周内
- javascript 随机点名
- 将要到来的三大技术革命与联系
- Oracle数据库只读与可写状态的变更
- javascript实现文本域的写入字符个数 限定字数
- 使用JMX产品jolokia对Mule esb进行监控