java解四元一次方程

问题:求解四元一次方程,例如

       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;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值