这两天刚开始学习java,涉及的知识面比较浅,但相信和我一样的小伙伴们应该挺多吧,一起加油努力吧!
如下图:
先解释下什么是列主元素高斯消去法:(主要还是得会手工计算)
1.写出方程组的增广矩阵
2.把当前要消元的第一列的绝对值最大的元素所在的行与要消元的第一行互换
3.按照高斯消去法进行消元(可自行百度下高斯消元法)
上java代码:
public class Lwvuyrgcsixnqufa {
public static void main(String[] args){
double[][] array=creatArray();
fun(array);
}
public static double[][] creatArray(){ //生成增广矩阵的二维数组
double[][] arrays={
{1.1348,3.8326,1.1665,3.4017,9.5342},
{0.5301,1.7875,2.5330,1.5435,6.3941},
{3.4129,4.9317,8.7643,1.3142,18.4231},
{1.2371,4.9998,10.6721,0.0147,16.8237}
}; //可自行随意更换该增广矩阵矩阵
/*double[][] arrays={
{-3,2,6,4},
{10,-7,0,7},
{5,-1,5,6}
};*/
return arrays;
}
public static void fun(double[][] a){
int row=a.length,col=a[0].length;
int p=0,k=0;
while(sjjn(a)){ //循环终止的条件是方程的非增广矩阵形成了上三角矩阵
double max=Math.abs(a[p][p]);
for(int i=p+1;i<row;i++){ //选出主元,将下标赋值给k
if(Math.abs(a[i][p])>max){
max=a[i][p];
k=i;
}
}
if(k!=0){ //将主元行与参与运算的第一行互换
for(int i=p;i<col;i++){
double temp=a[p][i];
a[p][i]=a[k][i];
a[k][i]=temp;
}
}
yysr1(a,p); //进行运算,用当前主元行消去下面的所有行的第一个元素
p++;k=0;
}
print(a);
yysr2(a); //此时形成了非增广上三角矩阵,即可从下往上运算出x的值
}
public static boolean sjjn(double[][] arrays){ //检测是否形成了非增广上三角矩阵
for(int i=1;i<arrays.length;i++){
for(int j=0;j<i;j++)
if(arrays[i][j]!=0)
return true;
}
return false;
}
public static void yysr1(double[][] a,int p){ //进行第一步运算,用主元消去其他元
for(int i=p+1;i<a.length;i++){
double e=(a[i][p]/a[p][p]*(-1));
a[i][p]=0;
for(int j=p+1;j<a[0].length;j++){
a[i][j]+=e*a[p][j];
}
}
}
public static void print(double[][] a){ //输出消元完成后的矩阵
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++){
System.out.printf("%5.4f\t\t\t",a[i][j]);
}
System.out.println();
}
}
public static void yysr2(double[][] a){ //进行第二步运算
double[] list=new double[20];
int row=a.length,col=a[0].length,k=0;
double vi=0;
list[k]=a[row-1][col-1]/a[row-1][col-2]; //保存x值的数组
k++;
int t1=row-2,t2=col-2;
for(int i=0;i<row-1;i++){ //这段逻辑关系也不是很深,可以自己研究下
vi=a[t1][col-1];
for(int j=0;j<i+1;j++){
vi-=a[t1][t2]*list[j];
t2--;
}
list[k]=vi/a[t1][t2];
k++;
t1--;
t2=col-2;
}
printlist(list,k); //输出x的值
}
public static void printlist(double[] list,int k){ //输出x的值
for(int i=0,j=k;i<k;i++,j--){
System.out.printf("x%d=%5.4f",j,list[i]); //输出的精度可自行控制
System.out.println();
}
}
}
运行截图:
有什么疑问可以在评论区问我~~~