雅克比迭代:
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("系数矩阵不合法! "); 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("迭代失败! "); 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("--------雅克比迭代-------- "); 99 int x,y; 100 cout<<"输入未知数个数与方程个数:"; 101 cin>>x>>y; 102 if(x!=y) { 103 cout<<"超定或欠定!"<<endl; 104 return 0; 105 } 106 //输入增广矩阵 107 printf("输入增广矩阵: "); 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("系数矩阵不合法! "); 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 ",k); 60 k++; 61 if(k>N) { 62 printf("迭代失败! "); 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迭代-------- "); 99 int x,y; 100 cout<<"输入未知数个数与方程个数:"; 101 cin>>x>>y; 102 if(x!=y) { 103 cout<<"超定或欠定!"<<endl; 104 return 0; 105 } 106 //输入增广矩阵 107 printf("输入增广矩阵: "); 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("解是: "); 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 */