C语言实现直接法解线性方程组
2016-05-22 15:43
555 查看
首先说以下什么是直接法,以及有哪些方法属于直接法。
Ø 矩阵三角分解法
这里主要阐述顺序高斯消去法接线性方程组(其他方法都是在这个的基础的稍作变化)
一.基本思想
利用线性方程组初等变换中的一种变换,即用一个不为零的数乘以一个方程加至
另一个方程,使方程组变成同解的上三角方程组,然后再自上而下对上三角方程组求解。
二.两个过程
顺序高斯消去法分为“消去”和“回代”两个过程。
三.一般求解过程
四.使用条件
因为这里涉及到对角线元素的除法,所以需要对角线上的元素全不为0。这里用一个
定理来说明:
方程组系数矩阵的顺序主子式全不为0,才能用高斯消去法实现方程组的求解。
五.代码实现
六.运行结果
直接法:经过有限步运算就能求得精确解的方法。
主要包括以下四种:
Ø 顺序高斯消去法
Ø 选主元高斯消去法
Ø 高斯-约当消去法Ø 矩阵三角分解法
这里主要阐述顺序高斯消去法接线性方程组(其他方法都是在这个的基础的稍作变化)
一.基本思想
利用线性方程组初等变换中的一种变换,即用一个不为零的数乘以一个方程加至
另一个方程,使方程组变成同解的上三角方程组,然后再自上而下对上三角方程组求解。
二.两个过程
顺序高斯消去法分为“消去”和“回代”两个过程。
三.一般求解过程
四.使用条件
因为这里涉及到对角线元素的除法,所以需要对角线上的元素全不为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"); }
六.运行结果
相关文章推荐
- c++ 编译器会绕过拷贝构造函数
- vs2010 mfc c++ 多线程
- C++ map容器 学习笔记
- 排列组合n选m C++实现
- c++ primer(第五版)学习笔记及习题答案代码版(第九章)顺序容器
- C++面向对象编程分享11----系统设计01
- c++作业6
- 关于求一个数的阶乘的C语言
- c++ 中__declspec 的用法
- ubuntu下安装eclipse(c++)
- C语言知识点总结
- C语言 抽象数据类型ADT
- c++作业六
- 浅谈C语言中结构体的初始化
- 通过引用计数实现智能指针(C++ Primer)
- C++课堂作业(2)
- C++课堂作业(2)
- c++实验6——数组合并
- Ubuntu 14 g++ 使用c++11特性报错
- 单链表及其基本操作(C语言实现)