算法虽然会,但是用数组的形式进行求值是一件非常非常恶心的事情。
更恶心的是,公司里面的逻辑居然要用到方程组求解,万分无奈之下,上网找了一份Java代码。
谁知道居然是个算法数组从1开始的。
好吧,认了吧,我就把你改过来。
调试通过。
留个代码做纪念。
- packagecom;
- publicclassEquationSolver{
- /**
- *@列主元高斯消去法
- */
- staticdoublea[][];
- staticdoubleb[];
- staticdoublex[];
- staticintn;
- staticintn2;//记录换行的次数
- publicstaticvoidElimination(){//消元
- PrintA();
- for(intk=0;k<n;k++)
- {
- Wrap(k);
- for(inti=k+1;i<n;i++)
- {
- doublel=a[i][k]/a[k][k];
- a[i][k]=0.0;
- for(intj=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();
- }
- }
- publicstaticvoidBack()//回代
- {
- x[n-1]=b[n-1]/a[n-1][n-1];
- for(inti=n-2;i>=0;i--)
- x[i]=(b[i]-jisuan(i))/a[i][i];
- }
- publicstaticdoublejisuan(inti){
- doublehe=0.0;
- for(intj=i;j<=n-1;j++)
- he=he+x[j]*a[i][j];
- returnhe;
- }
- publicstaticvoidWrap(intk){//换行
- doublemax=Math.abs(a[k][k]);
- intn1=k;//记住要交换的行
- for(inti=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(intj=k;j<n;j++)//交换a的行
- {
- doublex1;
- x1=a[k][j];
- a[k][j]=a[n1][j];
- a[n1][j]=x1;
- }
- doubleb1;//交换b的行
- b1=b[k];
- b[k]=b[n1];
- b[n1]=b1;
- System.out.println("交换后:");
- PrintA();
- }
- }
- publicstaticvoidDeterminant(){//求行列式
- doubleDM=1.0;
- for(inti=0;i<n;i++)
- {
- doublea2=a[i][i];
- DM=DM*a2;
- }
- doublen3=(double)n2;
- DM=DM*Math.pow(-1.0,n3);
- System.out.println("该方程组的系数行列式:detA="+DM);
- }
- publicstaticvoidPrintA(){//输出增广矩阵
- System.out.println("增广矩阵为:");
- for(inti=0;i<n;i++)
- {
- for(intj=0;j<n;j++)
- System.out.print(a[i][j]+"");
- System.out.print(b[i]+"");
- System.out.print("\n");
- }
- }
- publicstaticvoidPrint(){//输出方程的根
- System.out.println("方程组的根为:");
- for(inti=0;i<n;i++)
- System.out.println("x"+i+"="+x[i]);
- }
- publicstaticvoidmain(String[]args){
- //Scanneras=newScanner(System.in);
- System.out.println("输入方程组的元数:");
- //n=as.nextInt();
- n=2;
- a=newdouble[n][n];
- b=newdouble[n];
- x=newdouble[n];
- doubleinputA[][]={{1,1},{1,-1}};
- a=inputA;
- doubleinputB[]={2,0};
- b=inputB;
- doubleinputX[]={1,1};
- System.out.println("输入方程组的系数矩阵a:");
- //for(inti=1;i<=n;i++)
- //for(intj=1;j<=n;j++)
- //a[i][j]=as.nextDouble();
- System.out.println("输入方程组矩阵b:");
- //for(inti=1;i<=n;i++)
- //b[i]=as.nextDouble();
- Elimination();
- Back();
- Print();
- Determinant();
- }
- }