C语言实现直接法解线性方程组

来源:互联网 发布:如何在淘宝上搜高仿 编辑:程序博客网 时间:2024/06/02 05:55

首先说以下什么是直接法,以及有哪些方法属于直接法。

直接法:经过有限步运算就能求得精确解的方法。 

主要包括以下四种:

Ø 顺序高斯消去法

Ø 选主元高斯消去法

Ø 高斯-约当消去法

Ø 矩阵三角分解法

这里主要阐述顺序高斯消去法接线性方程组(其他方法都是在这个的基础的稍作变化)
一.基本思想

  利用线性方程组初等变换中的一种变换,即用一个不为零的数乘以一个方程加至

另一个方程,使方程组变成同解的上三角方程组,然后再自上而下对上三角方程组求解。

二.两个过程

   顺序高斯消去法分为“消去”和“回代”两个过程。

三.一般求解过程


四.使用条件

   因为这里涉及到对角线元素的除法,所以需要对角线上的元素全不为0。这里用一个

定理来说明:

  方程组系数矩阵的顺序主子式全不为0,才能用高斯消去法实现方程组的求解。

五.代码实现

<span style="color:#330099;"><span style="white-space: pre;"></span>/**作者:朱康*时间:2016/5/1416: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");}

六.运行结果




0 0