- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 线性方组直接求解
* 第3章 线性方程组直接求解 顺序高斯消元法 列主元高斯消元法 全主元高斯消元法 高斯约当消元法 消元形式的追赶法 LU分解法 矩阵形式的追赶法 平方根法 3.1 引言 n阶线性方程组的一般形式为: a11x1+a12x2+…+a1nxn=b1 a21x1+a22x2+…+a2nxn=b2 … … … … an1x1+an2x2+…+annxn=bn n阶线性方程组一般形式的矩阵形式为: 阶数在100~150以上的线性方程组为高阶线性方程组 阶数在100~150以下的线性方程组为低阶线性方程组 实际应用中,经常见到高阶稀疏线性方程组,低阶稠密线性方程组,对称正定线性方程组,带状线性方程组等等。 系数矩阵的大部分元素为零元素的线性方程组为稀疏线性方程组 系数矩阵的大部分元素为非零元素的线性方程组为稠密线性方程组 克莱姆法则并不实用。常用的数值解法主要分为两类: ① 直接求解方法是指经过有限次四则运算,求出线性方程组精确解的方法。 ② 迭代求解方法是指构造一种迭代方法,由某个(套)迭代初值(粗略解),得到近似解序列,用序列极限逐步逼近线性方程组精确解的方法。 用顺序高斯消元法求解线性方程组的过程分为消元过程和回代过程。消元过程是自上而下,把原线性方程组化为上三角方程组的过程;回代过程是自下而上,对这个上三角方程组进行求解的过程。 3.2 顺序高斯消元法 消元的过程是对线性方程组做同解变换,把原线性方程组变为上三角方程组的过程。 消元过程 n阶线性方程组在消元过程一开始,可以表示为: 外层循环每循环一轮,就用涉及到的矩形区域中上面的第1行消去它下面各行左面的第1列,此矩形区域最上1行和最左1列在之后的消元过程中不再涉及(上标不再改变),除此之外的右下矩形区域中所有的系数被更新一遍,且上标k自增1。第k次消元的初始状态如左图所示。 3.2 顺序高斯消元法 在第k次更新的初始,涉及到的待更新矩形区域中,系数的上标都为k,此矩形区域中最左上角的系数的行标、列标也为k。更新的过程,就是用第k行消去第k+1行至第n行的第k列,并且让第k+1行至第n行,第k+1列至第n+1列的矩形区域的系数更新,上标变为k+1。在此后的消元过程中,第k行及之上和第k列及其左边的系数不再变化。 消元结束之后得到的上三角方程组中,每向下一行,上标k增1,即上标k=行标i,如右图所示。 3.2 顺序高斯消元法 顺序高斯消元法的算法 输入原方程组的阶数n。 输入原方程组的增广矩阵a[n][n+1]。 for(k=0;k=n-2;k++),循环1次消去1列。 (消元过程) for(i=k+1;i=n-1;i++),循环1次更新1行。 行乘子a[i][k]/=-a[k][k]。 for(j=k+1;j=n;j++) a[i][j]+=a[i][k]*a[k][j]; for(k=n-1;k=0;k--) (回代过程) s=0; for(j=k+1;j=n-1;j++) s+=a[k][j]*x[j]; x[k]=(a[k][n]-s)/a[k][k]; 输出原方程组的解x[n]。 3.2 顺序高斯消元法 顺序高斯消元法对应的程序(1/2) #include stdio.h #include math.h #define MAXSIZE 50 void input(double a[MAXSIZE][MAXSIZE+1],long n); void output(double x[MAXSIZE],long n); void main(void) { double a[MAXSIZE][MAXSIZE+1],x[MAXSIZE],s; long n,i,j,k; printf(\n请输入原方程组的阶数:); scanf(%ld,n); input(a,n); for(k=0;k=n-2;k++) for(i=k+1;i=n-1;i++) { a[i][k]/=-a[k][k]; for(j=k+1;j=n;j++) a[i][j]+=a[i][k]*a[k][j]; } for(k=n-1;k=0;k--) { s=0; for(j=k+1;j=n-1;j++) s+=a[k][j]*x[j]
文档评论(0)