分享

java解四元一次方程

 启云_9137 2022-06-21 发表于湖南

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

       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这个二维数组)


/**
 * 解四元一次方程
 * @author liuyj
 */
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);

}

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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多