数值作业:顺序消去法解线性方程组之C语言代码
来源:互联网 发布:上海知恩服饰怎么样 编辑:程序博客网 时间:2024/06/10 10:20
实际上后面的Guass列主选主元,全选主元,都是由顺序高斯消元法稍加改动变化而来的,但是顺序消元会出现一个问题,如果我们要保留的那个元的系数很小,那么在消元过程中,势必会用很大的数字乘以次方程后再加到别的方程上消去别的方程中的改元,这样就会造成其他元的系数超大,而且计算过程容易累积误差。为了避免此,就提出了列主元高斯消元法,即在每次选择保留的元时,选择那个元所对应的系数较大的所对应的方程,然后基于次方程来对其他方程消元,这样这个元所对应最大的系数不就是这元所对应的列中最大的系数,因而取名为列主元高斯消元法。
1,Guass列选主元消去法(题目就用实验上的,如果结果与列选主元相同则表面代码正确)
|2.5 2.3 -5.1| | x1 | |3.7|
|5.3 9.6 1.5 | | x2 | = |3.8|
|8.1 1.7 -4.3| | x3 | |5.5|
有了前面的基础,这个可以依葫芦画瓢了,一步一步解决就OK了:
1.输入方程组的维数n,矩阵A,右端项b,控制精度这里我们定义了一个宏常量eps(1e-6,代表10的负6次方)...talk is cheap,let’s show my code. 下面上自己的代码:
/************************************************************************* > File Name: sequence.c > Author:chendiyang > School:WUST_CST_1501班 > Myblog:www.chendsir.com > Mail:1441353519@qq.com > Created Time: 2017年04月19日 星期三 19时09分31秒 ************************************************************************/#include <stdio.h>#include <math.h>#define MAX 20 //最大维数 #define eps 1e-10int main(){ int n; int i,j,k; int mi; double mx,tmp,sum; static double a[MAX][MAX],b[MAX],x[MAX]; printf("\n 输入方程组的维数:");//输入AX=b的维数 scanf("%d",&n); if(n>MAX) { printf("输入的维数过大!"); return 1; } if(n<=0) { printf("输入的维数过小!"); return 1; } //输入矩阵的值 printf("\n请输入A矩阵的值:"); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%lf",&a[i][j]); //输入b矩阵 printf("\n请输入B矩阵的值:"); for(i=0;i<n;i++) scanf("%lf",&b[i]); //Guass消元 for(k=0;k<(n-1);k++) { for(i=(k+1);i<n;i++) { if(fabs(a[k][k])<eps) //与我们定义的精度进行比较 { printf("\n主元素过小..\n"); return 1; } tmp=a[i][k]/a[k][k]; for(j=(k+1);j<(n);j++) {a[i][j]-=tmp*a[k][j];}//不同的是这里没有进行与列的交换,就造成了保留 b[i]-=tmp*b[k]; //系数比较小,从而造成误差大,列选主元解决了这个问题 a[i][k]=0; } } x[n-1]=b[n-1]/a[n-1][n-1]; //回代 for(i=(n-2);i>=0;i--) //解方程 { x[i]=b[i]; for(j=(i+1);j<n;j++) { x[i]-=a[i][j]*x[j];//这些都和Guass列选主元消去法都一样 } x[i]/=a[i][i]; } //输出运行结果 printf("solution is :\n"); for(i=0;i<n;i++) printf("%lf\n",x[i]); return 0; }
运算结果如图:
可以看到图中运行的guass.c源文件(./guass代表运行这个程序,这是Linux上的gcc编译和运行命令),同时又运行了sequence.c源文件(./sequence代表运行这个程序)两个结果都是相同的,这表明,列选主元和顺序消去法的结果是一模一样,看了顺序消去法对于本题目并没有产生很大的误差..
- 数值作业:顺序消去法解线性方程组之C语言代码
- 数值作业:Guass全选主元消去法之C语言代码
- 数值分析之直接法解线性方程组:高斯消去法、高斯乔丹消去法
- 列主元Gauss消去法解线性方程组(C语言)
- 线性方程组数值解法-列主元高斯消去法
- 顺序高斯消去法求线性方程组
- 实验一:Guass列选主元消去法之C语言代码
- Gauss消去法解线性方程组(C语言版)
- 计算方法之用高斯列主元消去法求线性方程组
- 求解线性方程组之Gauss_Jordan消去法
- 数值作业:Crout克洛特分解法之C语言代码
- 数值作业:Hermite多项式插值法之C语言代码
- 数值作业:Hermite插值法之C语言实现代码
- 数值作业:最小二乘法进行线性拟合之C语言代码
- 高斯消去法解线性方程组
- Gauss消去法解线性方程组(Matlab)
- 行主元素消去法求解线性方程组的Pascal代码
- 求解线性方程组--全主元消去法
- C++快速入门笔记(一)
- Android问题集锦之五十一:Thread updates not enabled for selected client
- 模板_Dijkstra最短路径算法
- Appframework3.0下非主页实现iscroll
- Unity —— 从UE4到Unity的转变和思考
- 数值作业:顺序消去法解线性方程组之C语言代码
- ZereneStacker 1.04 T201602151850 for Windows / Mac 焦点堆叠软件 简体中文 最新版汉化
- 【Codeforces 438 D】The Child and Sequence
- COGS 732. [网络流24题] 试题库
- 【IMWeb训练营作业】todo list
- [Java学习笔记]增强for循环和Map的两种读取方式
- Error:Failed to resolve: com.afollestad:material-dialogs:
- Swfit中枚举的总结以及使用
- LA3708 墓地雕塑