前言:
目前同学们对“n元线性方程组的通解”大体比较看重,看官们都需要剖析一些“n元线性方程组的通解”的相关知识。那么小编同时在网摘上搜集了一些有关“n元线性方程组的通解””的相关知识,希望你们能喜欢,你们一起来学习一下吧!前言
线性代数在大学中的许多专业都是一门非常重要的课程,而在线性代数的课程中,对于矩阵的化简是每个学习线性代数的大学生都必须掌握的一项技能,矩阵的化简能帮助我们解决求矩阵的秩和求线性方程组解的个数的等问题。但对于矩阵的化简,许多时候都让我们非常的头疼,如果计算量过大,就无法保证计算的正确性。因此,对于学计算机专业的我来说,我想能否通过代码的形式解决这一类问题呢。
一、输入矩阵的信息
首先,要对矩阵进行处理,就需要知道矩阵的行数和列数。因此,第一步需要输入矩阵的行数和列数。
这里定义了两个变量作为输入,通过do——while语句进行限制,当输入的值为负数或0时,提示重新输入。
具体的代码如下:
int A,B;System.out.println("矩阵化简为最简行列式");System.out.println("请输入矩阵的行数:");do { A=input.nextInt(); if(A<=0) { System.out.println("输入的矩阵的行数错误!"); System.out.println("请重新输入:"); }}while (A<=0);System.out.println("请输入矩阵的列数:");do { B=input.nextInt(); if(B<=0) { System.out.println("输入的矩阵的列数错误!"); System.out.println("请重新输入:"); }}while (B<=0);
然后通过两个for循环将矩阵中的所有的数进行输入。
具体的代码如下:
int [][]C=new int[A][B];for(int i=0;i<A;i++){ System.out.printf("请输入第%d行的所有数,每一个数之间用空格(或回车)隔开\n",i+1); for(int j=0;j<B;j++) { C[i][j]=input.nextInt(); }}二、矩阵的初始处理
第一步:
需要将矩阵的同行同列的数通过与其他行进行交换使的同行同列的第一个数不为0,如果矩阵的某一列的数全为0,则不需要对这一行进行处理。
首先定义了一个变量D,使得D等于A(A为上面定义的矩阵的行数),再定义F=A-D,之后通过do——while语句,每次让D减1,那么F就可以从0一直加到(A-1)。
具体的代码如下:
F=A-D;for(int i=F+1;i<A;i++){ if(C[F][F]!=0) { break; } else { if(C[i][F]!=0) { for(int j=0;j<B;j++) { E=C[F][j]; C[F][j]=C[i][j]; C[i][j]=E; } break; } }}
这一过程是在do——while语句里面进行的。
第二步:
当把矩阵同行同列的数全都换成不为0的数之后,就需要将该行与其他的行进行加法或减法运算,将其他行在该列下的所有数全部都化为0。
如下图所示的第一步操作:
第一个for循环是对每一行进行处理,然后在判断同行同列的数是否为0,目的是为了防止出现某一列数全为0的情况。之后在判断与他进行运算的其他行的该列下的数是否为0,如果为0则不进行运算。如果不为0则在判断这个数是大于0还是小于0,对于这两种情况有不同的处理。主要步骤是求两个数的最小公倍数,再将这个最小公倍数分别除以这两个数,得到两个新的倍数,之后通过这两个倍数与原来的两个数相乘在进行加法或减法运算,通过这样的操作,对于矩阵的初始处理就完成了。
具体的代码如下:
for(int i=0;i<A;i++){ if(i!=F&&C[i][F]!=0) { if(C[F][F]!=0) { if(C[i][F]<0) { for(G=C[F][F];G%(-C[i][F])!=0;) G+=C[F][F]; G1=G/C[F][F]; G2=G/(-C[i][F]); for(int j=0;j<B;j++) { C[i][j]=C[i][j]*G2+C[F][j]*G1; } } else { for(G=C[F][F];G%C[i][F]!=0;) G+=C[F][F]; G1=G/C[F][F]; G2=G/C[i][F]; for(int j=0;j<B;j++) { C[i][j]=C[i][j]*G2-C[F][j]*G1; } } } }}
第一个for循环是对每一行进行处理,再判断同行同列的数是否为0,目的是为了防止出现某一列数全为0的情况。之后再判断与他进行运算的其他行的该列下的数是否为0,如果为0则不进行运算。如果不为0则在判断这个数是大于0还是小于0,对于这两种情况有不同的处理。主要步骤是求两个数的最小公倍数,再将这个最小公倍数分别除以这两个数,得到两个新的倍数,之后通过这两个倍数与原来的两个数相乘在进行加法或减法运算,通过这样的操作,对矩阵的初始处理就完成了。
三.矩阵的进一步处理
通过上面的处理已经大致的完成了矩阵的化简操作,但在后面的测试中发现了一个问题,就是通过上面的运算结果,如果第一个非0的数不在同行同列,那么就无法与其他行进行加法或减法运算了。因此,就需要对这些行进行处理。
第一步:
在对这些行进行处理之前,先需要对所有行进行排序,排序的规则是每一行中第一个非0的数越靠前,则该行的排序越靠前。因此,需要创建了一个数组来记录每一行中第一个非0的数的位置。
具体的代码如下:
int []H=new int[A];for(int i=0;i<A;i++){ for(int j=0;j<B;j++) { if(C[i][j]!=0) { H[i]=B-j; break; } }}
记录好之后,再进行排序,其中不仅要交换两行的所有数,还要交换上面定义的数组里的数。
具体的代码如下:
for(int i=0;i<A;i++){ for(int j=i+1;j<A;j++) { if(H[i]<H[j]) { for(int k=0;k<B;k++) { E=C[i][k]; C[i][k]=C[j][k]; C[j][k]=E; } E=H[i]; H[i]=H[j]; H[j]=E; } }}
之后再通过与矩阵的初始处理第二步一样的操作,就能够对其做进一步的处理了。
具体的代码如下:
for(int i=0;i<A;i++){ if(R[i]==0) { for(int j=0;j<B;j++) { if(C[i][j]!=0) { if(C[i][j]<0) { for(int Q=0;Q<i;Q++) { if(C[Q][j]!=0) { for(G=C[Q][j];G%(-C[i][j])!=0;) G+=C[Q][j]; G1=G/C[Q][j]; G2=G/(-C[i][j]); for(int k=0;k<B;k++) { C[Q][k]=C[Q][k]*G1+C[i][k]*G2; } } } } else { for(int Q=0;Q<i;Q++) { if(C[Q][j]!=0) { for(G=C[Q][j];G%C[i][j]!=0;) G+=C[Q][j]; G1=G/C[Q][j]; G2=G/C[i][j]; for(int k=0;k<B;k++) { C[Q][k]=C[Q][k]*G1-C[i][k]*G2; } } } } break; } } }}四.显示最终结果
矩阵化为最简型矩阵我们都知道,第一个不为0的数一定是1。
首先,可以通过一个for循环将为0的数全部输出,对于不为0的数再做进一步的处理,因此,需要再循环里面定义一个变量U来记录第一个数是否为0,如果不为0则通过break退出循环,再对后面不为0的数进行处理。对于第一个不为0的数,需要判断其大于0还是小于0,并通过除以它本身使它变为1,而后面的数都要除以前面第一个不为0的数。如果后面的数除以第一个不为0的数除不尽,就需要用分数表示,且分子和分母都需要同时除以他们的最大公约数,最后就得到了最简型矩阵了。
具体的代码如下:
for(int i=0;i<A;i++) { E=0;U=0; for(int j=0;j<B;j++) { if(C[i][j]!=0) { E=C[i][j]; U=1; break; } } if(U==1) { for(int j=0;j<B;j++) { if(j==0) { if(C[i][j]%E!=0) { if(C[i][j]%E<0) { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print("-"+Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } else { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print(Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } } else { System.out.print(C[i][j]/E); } } else { if(C[i][j]%E!=0) { if(C[i][j]%E<0) { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print(" "+"-"+Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } else { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print(" "+Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } } else { System.out.print(" "+C[i][j]/E); } } } System.out.println(); } else { for(int j=0;j<B;j++) { if(j==0) { System.out.print("0"); } else { System.out.print(" 0"); } } System.out.println(); } }}public static int AAA(int J1,int J2){ while (J1!=J2) { if (J1>J2) J1=J1-J2; else J2=J2-J1; } return J1;}五.代码使用过程六.整体代码
package zuopin;import java.util.Scanner;public class str1{ public static void main(String[] args) { Scanner input=new Scanner(System.in); int A,B; System.out.println("矩阵化简为最简行列式"); System.out.println("请输入矩阵的行数:"); do { A=input.nextInt(); if(A<=0) { System.out.println("输入的矩阵的行数错误!"); System.out.println("请重新输入:"); } }while (A<=0); System.out.println("请输入矩阵的列数:"); do { B=input.nextInt(); if(B<=0) { System.out.println("输入的矩阵的列数错误!"); System.out.println("请重新输入:"); } }while (B<=0); int [][]C=new int[A][B]; for(int i=0;i<A;i++) { System.out.printf("请输入第%d行的所有数,每一个数之间用空格(或回车)隔开\n",i+1); for(int j=0;j<B;j++) { C[i][j]=input.nextInt(); } } int D=A,E,F,G,G1,G2; do{ F=A-D; for(int i=F+1;i<A;i++) { if(C[F][F]!=0) { break; } else { if(C[i][F]!=0) { for(int j=0;j<B;j++) { E=C[F][j]; C[F][j]=C[i][j]; C[i][j]=E; } break; } } } for(int i=0;i<A;i++) { if(i!=F&&C[i][F]!=0) { if(C[F][F]!=0) { if(C[i][F]<0) { for(G=C[F][F];G%(-C[i][F])!=0;) G+=C[F][F]; G1=G/C[F][F]; G2=G/(-C[i][F]); for(int j=0;j<B;j++) { C[i][j]=C[i][j]*G2+C[F][j]*G1; } } else { for(G=C[F][F];G%C[i][F]!=0;) G+=C[F][F]; G1=G/C[F][F]; G2=G/C[i][F]; for(int j=0;j<B;j++) { C[i][j]=C[i][j]*G2-C[F][j]*G1; } } } } } D--; }while (D>0); int []H=new int[A]; for(int i=0;i<A;i++) { for(int j=0;j<B;j++) { if(C[i][j]!=0) { H[i]=B-j; break; } } } for(int i=0;i<A;i++) { for(int j=i+1;j<A;j++) { if(H[i]<H[j]) { for(int k=0;k<B;k++) { E=C[i][k]; C[i][k]=C[j][k]; C[j][k]=E; } E=H[i]; H[i]=H[j]; H[j]=E; } } } int []R=new int[A]; for(int i=0;i<A;i++) { for(int j=0;j<=i;j++) { if(C[i][j]!=0) { R[i]=1; break; } } } for(int i=0;i<A;i++) { if(R[i]==0) { for(int j=0;j<B;j++) { if(C[i][j]!=0) { if(C[i][j]<0) { for(int Q=0;Q<i;Q++) { if(C[Q][j]!=0) { for(G=C[Q][j];G%(-C[i][j])!=0;) G+=C[Q][j]; G1=G/C[Q][j]; G2=G/(-C[i][j]); for(int k=0;k<B;k++) { C[Q][k]=C[Q][k]*G1+C[i][k]*G2; } } } } else { for(int Q=0;Q<i;Q++) { if(C[Q][j]!=0) { for(G=C[Q][j];G%C[i][j]!=0;) G+=C[Q][j]; G1=G/C[Q][j]; G2=G/C[i][j]; for(int k=0;k<B;k++) { C[Q][k]=C[Q][k]*G1-C[i][k]*G2; } } } } break; } } } } int U,J1; for(int i=0;i<A;i++) { for(int j=0;j<B;j++) { if(C[i][j]!=0) { if(C[i][j]<0) { for(int k=0;k<B;k++) { C[i][k]=-C[i][k]; } } break; } } } System.out.println("化简结果为:"); for(int i=0;i<A;i++) { E=0;U=0; for(int j=0;j<B;j++) { if(C[i][j]!=0) { E=C[i][j]; U=1; break; } } if(U==1) { for(int j=0;j<B;j++) { if(j==0) { if(C[i][j]%E!=0) { if(C[i][j]%E<0) { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print("-"+Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } else { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print(Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } } else { System.out.print(C[i][j]/E); } } else { if(C[i][j]%E!=0) { if(C[i][j]%E<0) { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print(" "+"-"+Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } else { J1=AAA(Math.abs(C[i][j]),Math.abs(E)); System.out.print(" "+Math.abs(C[i][j])/J1+"/"+Math.abs(E)/J1); } } else { System.out.print(" "+C[i][j]/E); } } } System.out.println(); } else { for(int j=0;j<B;j++) { if(j==0) { System.out.print("0"); } else { System.out.print(" 0"); } } System.out.println(); } } } public static int AAA(int J1,int J2){ while (J1!=J2) { if (J1>J2) J1=J1-J2; else J2=J2-J1; } return J1; }}
标签: #n元线性方程组的通解 #求行列式的值java算法