分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组(转载)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyywww666/article/details/42805071

算法介绍(迭代法介绍):

代码C语言实现;


    
    
  1. # include<stdio.h>
  2. # include<math.h>
  3. # define N 6
  4. /*
  5. *使用雅可比迭代法和高斯-赛德尔迭代法 求解线性方程组
  6. */
  7. main(){
  8. float NF2(float *x,float *y);
  9. float A[N][N],b[N],sum= 0;
  10. float x[N],y[N]={ 0},x0[N];
  11. int i,j,n= 0;
  12. //输入系数矩阵
  13. for(i= 0;i<N;i++){
  14. for(j= 0;j<N;j++){
  15. scanf( ”%f”,&A[i][j]);
  16. }
  17. }
  18. //输入常数矩阵
  19. for(i= 0;i<N;i++){
  20. scanf( ”%f”,&b[i]);
  21. }
  22. //输入解的初值
  23. for(i= 0;i<N;i++){
  24. scanf( ”%f”,&x0[i]);
  25. }
  26. //输出系数矩阵
  27. printf( ”输出该方程组的系数矩阵:\n”);
  28. for(i= 0;i<N;i++){
  29. for(j= 0;j<N;j++){
  30. printf( ”%3.1f “,A[i][j]);
  31. }
  32. printf( ”\n”);
  33. }
  34. //输出成数矩阵
  35. printf( ”输出该方程组的常数矩阵:\n”);
  36. for(i= 0;i<N;i++){
  37. printf( ”%3.1f\n”,b[i]);
  38. }
  39. //输出解的迭代初值
  40. printf( ”解该方程组的的迭代初值是:\n”);
  41. for(i= 0;i<N;i++)
  42. {
  43. printf( ”%3.1f\n”,x0[i]);
  44. }
  45. /*
  46. *利用雅可比迭代法求解线性方程组
  47. */
  48. for(i= 0;i<N;i++)
  49. {
  50. x[i]=x0[i];
  51. }
  52. for(n= 0;;n++){
  53. //计算下一个值
  54. for(i= 0;i<N;i++){
  55. sum= 0;
  56. for(j= 0;j<N;j++){
  57. if(j!=i){
  58. sum=sum+A[i][j]*x[j];
  59. }
  60. }
  61. y[i]=( 1/A[i][i])*(b[i]-sum);
  62. //sum=0;
  63. }
  64. //判断误差大小
  65. if(NF2(x,y)> 0.01){
  66. for(i= 0;i<N;i++){
  67. x[i]=y[i];
  68. }
  69. }
  70. else
  71. break;
  72. }
  73. printf( ”经过%d次雅可比迭代解出方程组的解:\n”,n+ 1);
  74. for(i= 0;i<N;i++){
  75. printf( ”%f “,y[i]);
  76. }
  77. /*
  78. *利用高斯-赛德尔迭代法求解线性方程组
  79. */
  80. for(i= 0;i<N;i++)
  81. {
  82. x[i]=x0[i];
  83. y[i]= 0;
  84. }
  85. for(n= 0;;n++){
  86. //计算下一个值
  87. for(i= 0;i<N;i++){
  88. sum= 0;
  89. for(j= 0;j<i;j++){
  90. sum=sum+A[i][j]*y[j];
  91. }
  92. for(j=i+ 1;j<N;j++){
  93. sum=sum+A[i][j]*x[j];
  94. }
  95. y[i]=( 1/A[i][i])*(b[i]-sum);
  96. //sum=0;
  97. }
  98. //判断误差大小
  99. if(NF2(x,y)> 0.01){
  100. for(i= 0;i<N;i++){
  101. x[i]=y[i];
  102. }
  103. }
  104. else
  105. break;
  106. }
  107. printf( ”\n经过%d次高斯-赛德尔迭代解出方程组的解:\n”,n+ 1);
  108. for(i= 0;i<N;i++){
  109. printf( ”%f “,y[i]);
  110. }
  111. }
  112. //求两个向量差的二范数函数
  113. float NF2(float *x,float *y){
  114. int i;
  115. float z,sum1= 0;
  116. for(i= 0;i<N;i++){
  117. sum1=sum1+ pow(y[i]-x[i], 2);
  118. }
  119. z= sqrt(sum1);
  120. return z;
  121. }


代码运行输入输出结果;

转载自:https://blog.csdn.net/yyywww666/article/details/42805071


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值