问题:求解四元一次方程,例如 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 然后再看下克拉默法则:
然后再看看代数余子式: ![]() 汗,最后步入正题,代码就简单了,其实就是套公式,看代码吧。。。 (注意要解的方程组把变量都放到左边,常亮放到右边,然后再写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; } |
|