您的位置:首页 > 编程语言 > Java开发

java解四元一次方程

2016-06-24 11:02 501 查看
问题:求解四元一次方程,例如

       x+y-z=9;
       x-y+2z=8;
       2x+y-z=7;
       x+y+z=m;
这个解是 x=-2.0 y=32.0 z=21.0 m=51.0
 
如果你想利用迭代暴力计算的话,不用试了,我替你试过了,太慢,慢的一天你也解不出来,比如x,y,z,m的范围是从-2.0到51.0
 
那么解决不了了吗?这时脑海中依稀想起来了大学学过线性代数,于是乎找美丽的度娘亲热了大半个下午,终于把线性代数这部分拾起来一部分o(╯□╰)o

顺便也帮大家温习下,先来个入门简单的

PS:或许好多客官认为这个温习没必要,傻逼才看呢,可是我想说,等你想拓展这个程序,想要解5元一次方程,n元一次方程的时候,你绝对用得着。但是如果你精通线代的话,算我没说。。。

然后再看下克拉默法则:

 
然后再看看代数余子式:

 
汗,最后步入正题,代码就简单了,其实就是套公式,看代码吧。。。
(注意要解的方程组把变量都放到左边,常亮放到右边,然后再写strss这个二维数组)
public
class
ArithmeticOfCalcFour {
   
    public
static void
main(String[] args) {
//     例子
//     x+y-z=9;
//     x-y+2z=8;
//     2x+y-z=7;
//     x+y+z=m;
//     解x=-2,y=32,z=21,m=51
       double[][] strss={
              {1,1,-1,0,9},
            {1,-1,2,0,8},
            {2,1,-1,0,7},
            {1,1,1,-1,0},
                      };
       calculate(strss);
       //test();
    }
   
    public
static void
calculate(double[][] strss) {
      
       double[][] dss={
                         {strss[0][0],strss[0][1],strss[0][2],strss[0][3]},
                         {strss[1][0],strss[1][1],strss[1][2],strss[1][3]},
                         {strss[2][0],strss[2][1],strss[2][2],strss[2][3]},
                         {strss[3][0],strss[3][1],strss[3][2],strss[3][3]}
                     };
       double[][] d1ss={
                         {strss[0][4],strss[0][1],strss[0][2],strss[0][3]},
                         {strss[1][4],strss[1][1],strss[1][2],strss[1][3]},
                         {strss[2][4],strss[2][1],strss[2][2],strss[2][3]},
                         {strss[3][4],strss[3][1],strss[3][2],strss[3][3]}
                     };
       double[][] d2ss={
                         {strss[0][0],strss[0][4],strss[0][2],strss[0][3]},
                         {strss[1][0],strss[1][4],strss[1][2],strss[1][3]},
                         {strss[2][0],strss[2][4],strss[2][2],strss[2][3]},
                         {strss[3][0],strss[3][4],strss[3][2],strss[3][3]}
                     };
       double[][] d3ss={
                         {strss[0][0],strss[0][1],strss[0][4],strss[0][3]},
                         {strss[1][0],strss[1][1],strss[1][4],strss[1][3]},
                         {strss[2][0],strss[2][1],strss[2][4],strss[2][3]},
                         {strss[3][0],strss[3][1],strss[3][4],strss[3][3]}
                     };
       double[][] d4ss={
                         {strss[0][0],strss[0][1],strss[0][2],strss[0][4]},
                         {strss[1][0],strss[1][1],strss[1][2],strss[1][4]},
                         {strss[2][0],strss[2][1],strss[2][2],strss[2][4]},
                         {strss[3][0],strss[3][1],strss[3][2],strss[3][4]}
                     };
      
       double d=calculateFour(dss);
       if(d==0){
           System.out.println("无解或多个解");
           return ;
       }
       double d1=calculateFour(d1ss);
       double d2=calculateFour(d2ss);
       double d3=calculateFour(d3ss);
       double d4=calculateFour(d4ss);
      
       double x=d1/d;
       double y=d2/d;
       double z=d3/d;
       double m=d4/d;
       System.out.println("结果:x="+x+"y="+y+"z="+z+"m="+m);
       System.out.println("计算完毕!");
    }
   
    /**
     * 计算4阶线性方程组
     * @param strss
     * @return
     */
    private
static double
calculateFour(double[][] strss) {
      
//     {strss[0][0],strss[0][1],strss[0][2],strss[0][3]},
//     {strss[1][0],strss[1][1],strss[1][2],strss[1][3]},
//     {strss[2][0],strss[2][1],strss[2][2],strss[2][3]},
//     {strss[3][0],strss[3][1],strss[3][2],strss[3][3]}
      
       double[][] t00={
                         {strss[1][1],strss[1][2],strss[1][3]},
                         {strss[2][1],strss[2][2],strss[2][3]},
                         {strss[3][1],strss[3][2],strss[3][3]}
                     };
       double[][] t01={
                         {strss[1][0],strss[1][2],strss[1][3]},
                         {strss[2][0],strss[2][2],strss[2][3]},
                         {strss[3][0],strss[3][2],strss[3][3]}
                     };
       double[][] t02={
                         {strss[1][0],strss[1][1],strss[1][3]},
                         {strss[2][0],strss[2][1],strss[2][3]},
                         {strss[3][0],strss[3][1],strss[3][3]}
                     };
       double[][] t03={
                         {strss[1][0],strss[1][1],strss[1][2]},
                         {strss[2][0],strss[2][1],strss[2][2]},
                         {strss[3][0],strss[3][1],strss[3][2]}
                     };
       double result=Math.pow(-1, 0+0)*strss[0][0]*calculateThree(t00)+ Math.pow(-1, 0+1)*strss[0][1]*calculateThree(t01) +
              Math.pow(-1, 0+2)*strss[0][2]*calculateThree(t02)+ Math.pow(-1, 0+3)*strss[0][3]*calculateThree(t03) ;
      
       return result;
    }
 
    /**
     * 计算3阶行列式
     * @param strss
     * @return
     */
    private
static double
calculateThree(double[][] strss) {
//     {strss[0][0],strss[0][1],strss[0][2]
//     {strss[1][0],strss[1][1],strss[1][2]
//     {strss[2][0],strss[2][1],strss[2][2]
      
       double result=strss[0][0]*strss[1][1]*strss[2][2] +  strss[0][1]*strss[1][2]*strss[2][0] +  strss[0][2]*strss[1][0]*strss[2][1] + 
              -strss[0][2]*strss[1][1]*strss[2][0] -strss[0][1]*strss[1][0]*strss[2][2] - strss[0][0]*strss[2][1]*strss[1][2] ;
      
       return result;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: