zoukankan      html  css  js  c++  java
  • 【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("系数矩阵不合法!
    ");
     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 */ 
  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/duye/p/9118920.html
Copyright © 2011-2022 走看看