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 */ 
  • 相关阅读:
    Unity游戏开发之AR增强现实技术入门
    python3快速入门
    大数据Hadoop入门到精通 (精品课程)
    JavaScript基础训练营
    我的超级工具
    html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域
    Centos7-驱动小米WIFI做AP
    rz快速上传文件到ssh服务器
    Ansible批量修改root密码
    ArcGIS API for JavaScript 入门教程[0] 目录
  • 原文地址:https://www.cnblogs.com/duye/p/9118920.html
Copyright © 2011-2022 走看看