【C/C++】求解线性方程组的雅克比迭代与高斯赛德尔迭代

雅克比迭代:

  1 /*
  2     方程组求解的迭代法:
  3     雅克比迭代 
  4 */ 
  5 
  6 #include<bits/stdc++.h>
  7 using namespace std;
  8 
  9 double A[10][10];
 10 double re[10];
 11 void swapA(int i,int j,int n){
 12     //交换第i行与第j行 
 13     for(int x = 0;x<=n;x++) {
 14         double temp = A[i][x];
 15         A[i][x] = A[j][x];
 16         A[j][x] = temp;
 17     }
 18 }
 19 
 20 void getResult(int n,double e,int N){
 21     //n个未知参数 
 22     for(int i = 0;i<n;i++){
 23         //初始化
 24         re[i] = 0.0;
 25     }
 26     //先检验对角线元素是否为0,如果为0则交换某两列
 27     //什么时候会交换失败? 
 28     for(int i = 0;i<n;i++) {
 29         if(fabs(A[i][i]-0)<=1e-9){
 30             //如果第i行对角元素等于0
 31             //找第i列不为0的一列与其交换 
 32             int j;
 33             for(j = 0;j<n;j++){
 34                 if(fabs(A[j][i]-0)>1e-9){
 35                     swapA(i,j,n);
 36                     break;
 37                 }
 38             }
 39             if(j>=n){
 40                 printf("系数矩阵不合法!\n");
 41             }
 42             i = 0;//每次从头找 
 43         }
 44     }
 45     for(int i = 0;i<n;i++) {
 46         for(int j = 0;j<n+1;j++){
 47             printf("%lf ",A[i][j]);
 48         } 
 49         cout<<endl;
 50     }
 51     
 52     
 53     //下面迭代 
 54     int k = 0;
 55     double x[10];
 56     //初始化x[i]; 
 57     for(int i = 0;i<n;i++){
 58         x[i] = 0.0;
 59     }
 60     while(k<=N){
 61         k++;
 62         if(k>N) {
 63             printf("迭代失败!\n");
 64             exit(0);
 65         }
 66         for(int i = 0;i<n;i++){
 67             re[i] = A[i][n];
 68             for(int j = 0;j<n;j++){
 69                 if(j!=i){
 70                     re[i] = re[i] - A[i][j]*x[j];        
 71                 }
 72             }
 73             re[i] = re[i] / A[i][i];
 74         }
 75         //当最大的x误差小于e则退出 
 76         double maxXerror = 0.0; 
 77         for(int i = 0;i<n;i++){
 78             if(fabs(x[i]-re[i]) >maxXerror){
 79                 maxXerror = fabs(x[i] - re[i]);
 80             }
 81         }
 82         if(maxXerror < e){
 83             return;
 84         }
 85         printf("第%d步迭代结果:",k); 
 86         for(int i = 0;i<n;i++) {
 87             printf("%lf ",re[i]);
 88         }
 89         cout<<endl;
 90         //否则,继续 
 91         for(int i = 0;i<n;i++){
 92             x[i] = re[i];
 93         }
 94     }
 95 }
 96 
 97 int main() {
 98     printf("--------雅克比迭代--------\n\n");
 99     int x,y;
100     cout<<"输入未知数个数与方程个数:";
101     cin>>x>>y;
102     if(x!=y) {
103         cout<<"超定或欠定!"<<endl;
104         return 0;
105     }
106     //输入增广矩阵
107     printf("输入增广矩阵:\n");
108     for(int i = 0;i<x;i++){
109         for(int j = 0;j<x+1;j++){
110             cin>>A[i][j];
111         }
112     }
113     //double re[10];
114     cout<<"输入精度e和最大迭代次数:" ;
115     double e;
116     int N;
117     cin>>e>>N;
118     getResult(x,e,N);
119     for(int i = 0;i<x;i++){
120         cout<<re[i]<<" ";
121     }
122 }
123 /*
124 输入增广矩阵:
125 10 -1 -2 7.2
126 -1 10 -2 8.3
127 -1 -1 5 4.2
128 输入精度e和最大迭代次数:0.01 100
129 */
130 /*
131 输入未知数个数与方程个数:4 4
132 输入增广矩阵:
133 10 0 1 -5 -7
134 1 8 -3 0 11
135 3 2 -8 1 23
136 1 -2 2 7 17
137 输入精度e和最大迭代次数:0.01 100
138 10.000000 0.000000 1.000000 -5.000000 -7.000000
139 1.000000 8.000000 -3.000000 0.000000 11.000000
140 3.000000 2.000000 -8.000000 1.000000 23.000000
141 1.000000 -2.000000 2.000000 7.000000 17.000000
142 0
143 1
144 2
145 3
146 4
147 5
148 6
149 7
150 8
151 0.998994 0.501136 -1.9985 2.99615
152 --------------------------------
153 */
154 //当主对角有0 
155 /*
156 输入未知数个数与方程个数:4 4
157 输入增广矩阵:
158 1 8 -3 0 11
159 10 0 1 -5 -7
160 3 2 -8 1 23
161 1 -2 2 7 17
162 输入精度e和最大迭代次数:0.01 100
163 10.000000 0.000000 1.000000 -5.000000 -7.000000
164 1.000000 8.000000 -3.000000 0.000000 11.000000
165 3.000000 2.000000 -8.000000 1.000000 23.000000
166 1.000000 -2.000000 2.000000 7.000000 17.000000
167 0
168 1
169 2
170 3
171 4
172 5
173 6
174 7
175 8
176 0.998994 0.501136 -1.9985 2.99615
177 
178 */

G-S迭代:

  1 /*
  2     G-S迭代: 
  3 */
  4 #include<bits/stdc++.h>
  5 using namespace std;
  6 
  7 double A[10][10];
  8 double re[10];
  9 void swapA(int i,int j,int n){
 10     //交换第i行与第j行 
 11     for(int x = 0;x<=n;x++) {
 12         double temp = A[i][x];
 13         A[i][x] = A[j][x];
 14         A[j][x] = temp;
 15     }
 16 }
 17 
 18 void getResult(int n,double e,int N){
 19     //n个未知参数 
 20     for(int i = 0;i<n;i++){
 21         //初始化
 22         re[i] = 0.0;
 23     }
 24     //先检验对角线元素是否为0,如果为0则交换某两列
 25     //什么时候会交换失败? 
 26     for(int i = 0;i<n;i++) {
 27         if(fabs(A[i][i]-0)<=1e-9){
 28             //如果第i行对角元素等于0
 29             //找第i列不为0的一列与其交换 
 30             int j;
 31             for(j = 0;j<n;j++){
 32                 if(fabs(A[j][i]-0)>1e-9){
 33                     swapA(i,j,n);
 34                     break;
 35                 }
 36             }
 37             if(j>=n){
 38                 printf("系数矩阵不合法!\n");
 39             }
 40             i = 0;//每次从头找 
 41         }
 42     }
 43     for(int i = 0;i<n;i++) {
 44         for(int j = 0;j<n+1;j++){
 45             printf("%lf ",A[i][j]);
 46         } 
 47         cout<<endl;
 48     }
 49     
 50     
 51     //下面迭代 
 52     int k = 0;
 53     double x[10];
 54     //初始化x[i]; 
 55     for(int i = 0;i<n;i++){
 56         x[i] = 0.0;
 57     }
 58     while(k<=N){
 59     //    printf("%d\n",k);
 60         k++;
 61         if(k>N) {
 62             printf("迭代失败!\n");
 63             exit(0);
 64         }
 65         for(int i = 0;i<n;i++){
 66             re[i] = A[i][n];
 67             for(int j = 0;j<i;j++){
 68                 re[i] = re[i] - A[i][j]*re[j];
 69             }
 70             for(int j = i+1;j<n;j++){
 71                 re[i] = re[i] - A[i][j]*x[j];
 72             }
 73             re[i] = re[i] / A[i][i];
 74         }
 75         //当最大的x误差小于e则退出 
 76         double maxXerror = 0.0; 
 77         for(int i = 0;i<n;i++){
 78             if(fabs(x[i]-re[i]) >maxXerror){
 79                 maxXerror = fabs(x[i] - re[i]);
 80             }
 81         }
 82         if(maxXerror < e){
 83             return;
 84         }
 85         printf("第%d步迭代结果:",k); 
 86         for(int i = 0;i<n;i++) {
 87             printf("%lf ",re[i]);
 88         }
 89         cout<<endl;
 90         //否则,继续 
 91         for(int i = 0;i<n;i++){
 92             x[i] = re[i];
 93         }
 94     }
 95 }
 96 
 97 int main() {
 98     printf("--------G-S迭代--------\n\n");
 99     int x,y;
100     cout<<"输入未知数个数与方程个数:";
101     cin>>x>>y;
102     if(x!=y) {
103         cout<<"超定或欠定!"<<endl;
104         return 0;
105     }
106     //输入增广矩阵
107     printf("输入增广矩阵:\n");
108     for(int i = 0;i<x;i++){
109         for(int j = 0;j<x+1;j++){
110             cin>>A[i][j];
111         }
112     }
113     //double re[10];
114     cout<<"输入精度e和最大迭代次数:" ;
115     double e;
116     int N;
117     cin>>e>>N;
118     getResult(x,e,N);
119     printf("解是:\n");
120     for(int i = 0;i<x;i++){
121         cout<<re[i]<<" ";
122     }
123 }
124 //相同的精度,G-S需要6次,而雅克比需要9次 
125 /*
126 输入未知数个数与方程个数:4 4
127 输入增广矩阵:
128 10 0 1 -5 -7
129 1 8 -3 0 11
130 3 2 -8 1 23
131 1 -2 2 7 17
132 输入精度e和最大迭代次数:0.01 100
133 10.000000 0.000000 1.000000 -5.000000 -7.000000
134 1.000000 8.000000 -3.000000 0.000000 11.000000
135 3.000000 2.000000 -8.000000 1.000000 23.000000
136 1.000000 -2.000000 2.000000 7.000000 17.000000
137 0
138 1
139 2
140 3
141 4
142 5
143 6
144 0.999337 0.500458 -2.00027 3.0003
145 --------------------------------
146 */ 

 

posted @ 2018-05-31 20:57  pigcv  阅读(4158)  评论(0编辑  收藏  举报