C語言實現直接法解線性方程組
阿新 • • 發佈:2019-01-01
利用線性方程組初等變換中的一種變換,即用一個不為零的數乘以一個方程加至
另一個方程,使方程組變成同解的上三角方程組,然後再自上而下對上三角方程組求解。
二.兩個過程
順序高斯消去法分為“消去”和“回代”兩個過程。
三.一般求解過程
四.使用條件
因為這裡涉及到對角線元素的除法,所以需要對角線上的元素全不為0。這裡用一個
定理來說明:
方程組係數矩陣的順序主子式全不為0,才能用高斯消去法實現方程組的求解。
五.程式碼實現
<span style="color:#330099;"><span style="white-space: pre;"> </span>/* *作者:朱康 *時間:2016/5/14 16:49 *描述:使用順序高斯消去法求線性方程組的解 */ #include<stdio.h> void cal_elimination(double p[][20], double *constant_vector, int n); //消去 void cal_substitution(double p[][20], double *constant_vector, double *matrix_result, int n); //回代 void print_elimi(double p[][20], int n); //輸出變換後的係數矩陣 void print_const(double *constant_vector, int n); //輸出變換後的常向量矩陣 void print_result(double *matrix_result, int n); //輸出解 void main() { double matrix_coeff[20][20]={0}; //係數矩陣 double (*p)[20] = matrix_coeff; double constant_vector[20]={0}; //常向量 double matrix_result[20]={0}; printf("請輸入解向量的數目:\n"); int n; scanf("%d", &n); printf("請輸入係數矩陣:\n"); int i, j; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { scanf("%lf", p[i] + j); } } printf("請輸入%d個常向量:\n", n); for(i = 0; i < n; i++) { scanf("%lf", &constant_vector[i]); } p = matrix_coeff; cal_elimination(p, constant_vector, n); print_elimi(p, n); print_const(constant_vector, n); cal_substitution(p, constant_vector, matrix_result, n); print_result(matrix_result, n); } //void cal_elimination(int (*p)[20], int n) //消去 void cal_elimination(double p[][20], double *constant_vector, int n) //消去 { int i, j, t = 0, r = 0; double temp[20] = {0}; double con_temp = 0; for(; r < n ; r++) { for(i = r; i < n - 1; i++) //行座標 { double k1 = -(p[i + 1][r] / p[r][r]); //計算每次要加的值,對於係數矩陣 double k2 = k1 * constant_vector[r]; //計算每次加到常向量上的值 for(j = 0; j < n; j++) { temp[j] = p[r][j] * k1; } t = i + 1; for(j = 0; j < n; j++) { p[t][j] += temp[j]; } constant_vector[t] += k2; //計算常向量上的值 } } } void cal_substitution(double p[][20], double *constant_vector, double *matrix_result, int n) //回代求解 { int i, j; matrix_result[n - 1] = constant_vector[n - 1] / p[n - 1][n - 1]; for(i = n - 2; i >= 0; i--) { double temp = 0; for(j = i + 1; j < n; j++) { temp += p[i][j] * matrix_result[j]; } matrix_result[i] = (constant_vector[i] - temp) / p[i][i]; } } void print_elimi(double p[][20], int n) { printf("變換後的係數矩陣:\n"); int i, j; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { printf("%5.1lf", p[i][j]); } printf("\n"); } } void print_const(double *constant_vector, int n) { printf("變換後的常向量矩陣:\n"); int i; for(i = 0; i < n; i++) { printf("%5.1f\n", *(constant_vector + i)); } printf("\n"); } void print_result(double *matrix_result, int n) { int i; printf("解為:\n"); for(i = 0; i < n; i++) { printf("x%d=%4.4f\n", i, *(matrix_result + i)); } printf("\n"); }