###### tags: `code` # c14086028-homework-6-2 ###### tags: `use'C' to code the 'L-AL:Gaussian Elimination' to find inverse` ```cpp= #include<stdio.h> #include<stdlib.h> # define N 20 void initial(double [N][N] ,double [N][N], double* ); void clear(double[N][N],double [N][N],double [N]); void clear2(double[N][N],double [N][N], double[N]); double matrixsolver(double[N][N], double [N][N],double[N]); int main() { double u = 0; double A[N][N] = { {} }; double B[N][N] = { {} }; double F[N] = {}; initial(A,B,F); /*print initial*/ printf("initial linear problem is \n"); printf("-----------\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%1.3lf\t", A[i][j]); } printf("\n"); } printf("-----------\n"); for (int i = 0; i < N; i++) { printf("%1.3lf\n", F[i]); } printf("\n"); printf("-----------\n"); /*solve and print it */ u=matrixsolver(A,B,F); if (u == 0) { printf("solution is\n"); printf("-----------\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%1.3lf\t", A[i][j]); } printf("\n"); } printf("inverse of A is\n"); printf("-----------\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%1.3lf\t", B[i][j]); } printf("\n"); } printf("-----------\n"); for (int i = 0; i < N; i++) { printf("%1.3lf\n", F[i]); } } else { printf("it has a lot of solution\n"); } system("pause"); return 0; } void initial(double A[N][N],double B[N][N],double F[N]) { for (int i = 0; i < N; i++) { A[i][i] = -2; if ((i + 1) < N) { A[i][i + 1] = 1; A[i + 1][i] = 1; } F[i] = (i == 19); } for (int i = 0; i < N; i++) { B[i][i] = 1; } } void clear(double A[N][N],double B[N][N],double F[N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (A[i][j] != 0) { double t = 0; t = A[i][j]; for (int k = 0; k < N; k++) { A[i][k] = A[i][k] / t; } for (int k = 0; k < N; k++) { B[i][k] = B[i][k] / t; } F[i] = F[i] / t; break; } else { continue; } } } } void clear2(double A[N][N],double B[N][N] ,double F[N]) { for (int i = N - 1; i >= 0; i--) { for (int j = N - 1; j >= 0; j--) { if (A[i][j] != 0) { double t = 0; t = A[i][j]; for (int k = N-1; k >= 0; k--) { A[i][k] = A[i][k] / t; } for (int k = N-1; k >= 0; k--) { B[i][k] = B[i][k] / t; } F[i] = F[i] / t; break; } else { continue; } } } } double matrixsolver(double A[N][N], double B[N][N],double F[N]) { clear(A,B,F); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (A[i][j] != 0) { for (int k = i; k < N; k++) { if (A[k][j] != 0 && k!=i) { for (int l = 0; l < N; l++) { A[k][l] = A[k][l] - A[i][l]; } for (int l = 0; l < N; l++) { B[k][l] = B[k][l] - B[i][l]; } F[k] = F[k] - F[i]; } else { continue; } } break; } else { continue; } } clear(A,B,F); } clear2(A,B,F); for (int i = N-1; i >=0; i--) { for (int j = N-1; j >= 0; j--) { if (A[i][j] != 0) { for (int k = i; k >=0 ; k--) { if (A[k][j] != 0 && k != i) { for (int l = 0; l < N; l++) { A[k][l] = A[k][l] - A[i][l]; } for (int l = 0; l < N; l++) { B[k][l] = B[k][l] - B[i][l]; } F[k] = F[k] - F[i]; } else { continue; } } break; } else { continue; } } clear2(A,B,F); } for (int e = 0; e < N; e++) { if (A[e][e] == 0) { return 1; } } return 0; } ```