用C语言求解N阶线性矩阵方程Axb的简单解法

上传人:cn****1 文档编号:512674788 上传时间:2024-01-23 格式:DOCX 页数:11 大小:438.65KB
返回 下载 相关 举报
用C语言求解N阶线性矩阵方程Axb的简单解法_第1页
第1页 / 共11页
用C语言求解N阶线性矩阵方程Axb的简单解法_第2页
第2页 / 共11页
用C语言求解N阶线性矩阵方程Axb的简单解法_第3页
第3页 / 共11页
用C语言求解N阶线性矩阵方程Axb的简单解法_第4页
第4页 / 共11页
用C语言求解N阶线性矩阵方程Axb的简单解法_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《用C语言求解N阶线性矩阵方程Axb的简单解法》由会员分享,可在线阅读,更多相关《用C语言求解N阶线性矩阵方程Axb的简单解法(11页珍藏版)》请在金锄头文库上搜索。

1、用C语言求解N阶线性矩阵方程Ax=b的简单解法一、描述问题:题目:求解线性方程组Ax=b,写成函数。其中,A为nn的N阶矩阵,x为需要求解的n元未知数组成的未知矩阵,b为n个常数组成的常数矩阵。即运行程序时的具体实例为:转化为矩阵形式(为检验程序的可靠性,特意选取初对角线元素为0的矩阵方程组)即为:二、分析问题并找出解决问题的步骤:由高等代数知识可知,解高阶线性方程组有逆矩阵求解法、增广矩阵求解法等,而在计算机C语言中,有高斯列主消元法、LU分解法、雅克比迭代法等解法。为了与所学的高等代数知识相一致,选择使用“高斯简单迭代消元法”,与高等代数中的“增广矩阵求解法”相一致。以下简述高斯消元法的原

2、理:算法基本原理:首先,为了能够求解N阶线性方程组(N由用户输入),所以需要定义一个大于N维的数组adim+1dim+1(dim为设定的最大维数,防止计算量溢出),当用户输入的阶数N超过设定值时提示重启程序重新输入。进而,要判断方程组是否有解,无解提示重启程序重新输入,有解的话要判断是有无数不定解还是只有唯一一组解,在计算中,只有当原方程组有且只有一组解时算法才有意义,而运用高等代数的知识,只有当系数矩阵对应的行列式 |A|0 时,原方程组才有唯一解,所以输入系数矩阵后要计算该系数矩阵的行列式 |A|(定义了getresult(n)函数计算),当行列式 |A|=0 时同样应提示重启程序重新输入

3、, |A|0 时原方程组必然有且仅有唯一一组解。判断出方程组有且仅有唯一一组解后,开始将系数矩阵和常数矩阵(合并即为增广矩阵)进行初等行变换(以a11为基元开始,将第j列上j行以下的所有元素化为0),使系数矩阵转化为上三角矩阵。这里要考虑到一种特殊情况,即交换到第j-1列后,第j行第j列元素ajj=0,那此时不能再以ajj为基元。当变换到第j列时,从j行j列的元素ajj以下的各元素中选取第一个不为0的元素,通过第三类初等行变换即交换两行将其交换到ajj的位置上,然后再进行消元过程。交换系数矩阵中的两行,相当于两个方程的位置交换了。再由高斯消元法,将第j列元素除ajj外第j行以下的其他元素通过第

4、二种初等行变换化为0,这样,就能使系数矩阵通过这样的行变换化为一个上三角矩阵,即,当系数矩阵A进行初等行变换时,常数矩阵也要进行对应的初等行变换,即此时那么有接下来,进行“反代”,由可求出,再往上代入即可求出以此类推,即可从xn推到xn-1,再推到xn-2直至x1。至此,未知矩阵x的所有元素就全部求出,即求出了原方程组有且仅有的唯一一组解。基本原理示意图:三、编写程序1. #include2. #include3. #include4. #define dim 10 /定义最大的维数10,为防止计算值溢出5. double adim+1dim+1,bdim+1,xdim+1; /定义双精度数组

5、6. double temp;7. double getarray(int n); /定义输入矩阵元素的函数8. double showarray(int n); /定义输出化简系数矩阵过程的函数9. int n,i,j,k,p,q;10. double main()11. 12. 13. printf(请输入系数矩阵的阶数n(ndim)17. 18. printf(错误:元数超过初设定的值%d,请重启程序重新输入n,dim);19. exit(0);20. 21.22. /*输入系数矩阵和常数矩阵(即增广矩阵)的元素*/23. getarray(n);24. 25. /*使对角线上的主元素不

6、为0*/26. for(j=1;j=n-1;j+)27. 28. if(ajj=0)29. for(i=j+1;i=n;i+)30. 31. if(aij!=0)32. 33. /*交换增广矩阵的第i行与第j行的所有元素*/34. for(k=1;k=n;k+)35. 36. aik+=ajk;37. ajk=aik-ajk;38. aik-=ajk;39. 40. bi+=bj;41. bj=bi-bj;42. bi-=bj;43. 44. continue; /找到第j列第一个不为0的元素即跳回第一层循环45. 46. 47. /*开始用高斯简单迭代消元法进行求解计算*/48. for(j

7、=1;j=n-1;j+)49. 50. /*使系数矩阵转化为上三角矩阵,常数矩阵相应进行变换*/51. for(i=j+1;i=n;i+)52. 53. temp=aij/ajj;54. bi=bi-temp*bj;55. for(k=1;k=n;k+)56. aik=aik-temp*ajk;57. printf(n通过初等行变换增广矩阵矩阵C化为:n);58. /*输出进行初等行变换的过程*/59. printf(C=);60. for(p=1;p=n;p+)61. 62. for(q=1;q=1;j-)76. 77. xj=bj;78. for(k=n;k=j+1;k-)79. xj=x

8、j-xk*ajk;80. xj=xj/ajj;81. 82. printf(n原方程组的唯一一组实数解为:n);83. for(j=1;j=n;j+)84. printf(x%d= %.3fn,j,xj);85. 86.87. /*定义矩阵输入函数getarray(n)并打印以作检查*/88. double getarray(int n)89. 90. printf(n请输入该矩阵各行的实数(以空格隔开)n);91. for(i=1;i=n;i+)92. 93. printf(n第%d行:t,i);94. for(j=1;j=n;j+)95. 96. scanf(%lf,&aij);97. p

9、rintf(a%d%d= %.3f,i,j,aij);98. printf(n);99. 100. 101. printf(nA=);102. for(i=1;i=n;i+)103. 104. for(j=1;j=n;j+)105. printf(t%.3f,aij);106. printf(n);107. 108. printf(n);109. /*输入常数矩阵的各个数*/110. for(i=1;i=n;+i)111. 112. printf(请输入常数b%d = ,i);113. scanf(%lf,&bi);114. 115. 116.117. /*定义增广矩阵C输出函数showarr

10、ay(n)*/118. double showarray(int n)119. 120. printf(n通过初等行变换最终增广矩阵矩阵C化为:n);121. printf(C=);122. for(i=1;i=n;i+)123. 124. for(j=1;j=n;j+)125. printf(t%.3f,aij);126. printf(t%.3f,bi);127. printf(n);128. 129.130. temp=1;131. for(i=1;i=n;i+)132. temp*=aii;133. printf(n矩阵的行列式|A|=%fn,temp);134. /*判断原线性方程组是否有唯一解*/135. if(temp=0)136. 137. prin

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 文学/艺术/历史 > 人文/社科

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号