Java的高斯消元法

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

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

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

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

调试通过。

留个代码做纪念。

Java代码 收藏代码
  1. packagecom;
  2. publicclassEquationSolver{
  3. /**
  4. *@列主元高斯消去法
  5. */
  6. staticdoublea[][];
  7. staticdoubleb[];
  8. staticdoublex[];
  9. staticintn;
  10. staticintn2;//记录换行的次数
  11. publicstaticvoidElimination(){//消元
  12. PrintA();
  13. for(intk=0;k
  14. {
  15. Wrap(k);
  16. for(inti=k+1;i
  17. {
  18. doublel=a[i][k]/a[k][k];
  19. a[i][k]=0.0;
  20. for(intj=k+1;j
  21. a[i][j]=a[i][j]-l*a[k][j];
  22. b[i]=b[i]-l*b[k];
  23. }
  24. System.out.println("第"+k+"次消元后:");
  25. PrintA();
  26. }
  27. }
  28. publicstaticvoidBack()//回代
  29. {
  30. x[n-1]=b[n-1]/a[n-1][n-1];
  31. for(inti=n-2;i>=0;i--)
  32. x[i]=(b[i]-jisuan(i))/a[i][i];
  33. }
  34. publicstaticdoublejisuan(inti){
  35. doublehe=0.0;
  36. for(intj=i;j<=n-1;j++)
  37. he=he+x[j]*a[i][j];
  38. returnhe;
  39. }
  40. publicstaticvoidWrap(intk){//换行
  41. doublemax=Math.abs(a[k][k]);
  42. intn1=k;//记住要交换的行
  43. for(inti=k+1;i//找到要交换的行
  44. {
  45. if(Math.abs(a[i][k])>max){
  46. n1=i;
  47. max=Math.abs(a[i][k]);
  48. }
  49. }
  50. if(n1!=k)
  51. {
  52. n2++;
  53. System.out.println("当k="+k+"时,要交换的行是:"+k+"和"+n1);
  54. for(intj=k;j//交换a的行
  55. {
  56. doublex1;
  57. x1=a[k][j];
  58. a[k][j]=a[n1][j];
  59. a[n1][j]=x1;
  60. }
  61. doubleb1;//交换b的行
  62. b1=b[k];
  63. b[k]=b[n1];
  64. b[n1]=b1;
  65. System.out.println("交换后:");
  66. PrintA();
  67. }
  68. }
  69. publicstaticvoidDeterminant(){//求行列式
  70. doubleDM=1.0;
  71. for(inti=0;i
  72. {
  73. doublea2=a[i][i];
  74. DM=DM*a2;
  75. }
  76. doublen3=(double)n2;
  77. DM=DM*Math.pow(-1.0,n3);
  78. System.out.println("该方程组的系数行列式:detA="+DM);
  79. }
  80. publicstaticvoidPrintA(){//输出增广矩阵
  81. System.out.println("增广矩阵为:");
  82. for(inti=0;i
  83. {
  84. for(intj=0;j
  85. System.out.print(a[i][j]+"");
  86. System.out.print(b[i]+"");
  87. System.out.print("\n");
  88. }
  89. }
  90. publicstaticvoidPrint(){//输出方程的根
  91. System.out.println("方程组的根为:");
  92. for(inti=0;i
  93. System.out.println("x"+i+"="+x[i]);
  94. }
  95. publicstaticvoidmain(String[]args){
  96. //Scanneras=newScanner(System.in);
  97. System.out.println("输入方程组的元数:");
  98. //n=as.nextInt();
  99. n=2;
  100. a=newdouble[n][n];
  101. b=newdouble[n];
  102. x=newdouble[n];
  103. doubleinputA[][]={{1,1},{1,-1}};
  104. a=inputA;
  105. doubleinputB[]={2,0};
  106. b=inputB;
  107. doubleinputX[]={1,1};
  108. System.out.println("输入方程组的系数矩阵a:");
  109. //for(inti=1;i<=n;i++)
  110. //for(intj=1;j<=n;j++)
  111. //a[i][j]=as.nextDouble();
  112. System.out.println("输入方程组矩阵b:");
  113. //for(inti=1;i<=n;i++)
  114. //b[i]=as.nextDouble();
  115. Elimination();
  116. Back();
  117. Print();
  118. Determinant();
  119. }
  120. }

你可能感兴趣的:(Java的高斯消元法)