雅克比迭代:

  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 */ 

转载于:https://www.cnblogs.com/duye/p/9118920.html

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

  1. 用MATLAB实现雅克比迭代、高斯-赛德尔迭代以及超松弛迭代

    文章目录 前言 一.解线性方程组的方法 二.解线性方程组的迭代法及其代码实现 1. 迭代法的收敛性 2. 基本参数设置 3. 雅克比(Jacobi)迭代 4. 高斯-塞德尔(Gauss-Seidel) ...

  2. 2021-01-07 matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法

    matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法 Function [x,iter]=gs(A,b,tol) D=diag(diag(A)); L=D-tril(A); U=D-triu ...

  3. 追赶法(Thomas) 雅克比迭代(Jacobi) 高斯迭代(Gauss) 的C++实现

    其实如果你搜到了这个博客 基本可以说明,你肯定已经知道什么是追赶法了 Python Python 就是大一大二的小孩拿来使自我感觉良好的骗子玩具(对低龄儿童和专业人士除外) LU分解 LU分解后,可以 ...

  4. 迭代法求解线性方程组的收敛问题总结

    本讲之前,先将高斯-赛德尔迭代法和雅克比迭代法以及迭代法求解线性方程组贴出来,毕竟收敛问题研究的是迭代方法的收敛问题. 进入主题: 判断迭代法收敛的办法: 1.首先根据方程组的系数矩阵A的特点判断: ...

  5. Gauss-Seidel迭代求解线性方程组

    高斯-赛德尔迭代法考试比较多,所以考虑再三,还是单独提取出来独立一篇,方便查阅,突出重点. 首先举例引入: 通过手动求解下面的线性方程组得到精确解: 再用高斯-赛德尔迭代法求解比较: 本人拙见,将每一 ...

  6. 【计算方法】雅克比迭代法-高斯赛德尔迭代法求解线性方程组(c语言实现)

    计算方法–用雅克比迭代法和高斯赛德尔迭代法求解线性方程组 AX = b 雅克比迭代法的数学基础 x = Gx + b x = (A ^ -1) b A = L + D + U(L是一个下三角阵,他的对 ...

  7. 数值计算大作业:Jacobi与Gauss -Seidel迭代求解线性方程组(Matlab实现)

    作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业. 我把Jacobi与Gauss -Seidel迭代求解线性方程组的数值计算作业在MATLAB中编程实现.具体的程序详细标注后放在文 ...

  8. Python——雅克比迭代求线性方程组的根

    Python--高斯赛德尔迭代求线性方程组的根 雅克比迭代 计算代码 矩阵A--方程组的系数.代码中只需改变矩阵系数即可 矩阵B--方程组等号右侧的常数. #雅克比迭代 #求解方程组: #10*x1 ...

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

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yyywww666/article/details/42805071 算法介绍(迭代法介绍): 代码C ...

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

    算法介绍(迭代法介绍): 代码C语言实现; # include<stdio.h> # include<math.h> # define N 6 /* *使用雅可比迭代法和高斯- ...

最新文章

  1. 鸽巢原理(The Pigeonhole Principle)(抽屉原理)
  2. oracle password_verify_function,使用PASSWORD_VERIFY_FUNCTION设置用户密码复杂度
  3. 【JetPack】数据绑定 DataBinding 简介 ( 使用要求 | Gradle 版本 | 定义数据类 | 定义数据绑定布局 | Activity 数据绑定 | 绑定类生成规则 )
  4. bootstrap-进度条
  5. 实现当前目录下开启CMD
  6. 第七周项目4-计算一个程序猿的周工资
  7. 如何配置数据库ODBC数据源
  8. perl调用shell命令并获取输出
  9. 添加到界面前获取尺寸
  10. securiteCRT中退出全屏
  11. spring boot动力电池数据管理系统毕业设计源码301559
  12. 计算机基础知识题库选择题,计算机基础知识题库选择题
  13. MAC OS系统如何使用动态远程桌面
  14. 对volatile关键字盲点感悟
  15. 排队叫号医院管理源码
  16. 快速理解-设计模式六大原则
  17. “笨办法”学Python3,Zed A. Shaw, 习题1~2
  18. 今日芯声 | Android麻烦了!鸿蒙OS将让它变得更脆弱
  19. selenium+python上传文件(Button按钮)
  20. LabVIEW2021中文版安装包、工具包、安装教程下载

热门文章

  1. 面试宝典(二)之经典面试题(含详细答案)
  2. 【读书】2022年阅读记录
  3. 论文阅读:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
  4. 批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
  5. 鸿蒙蕴含的哲理,苏轼最不该被忽视哲理名句:“人生到处知何似,应似飞鸿踏雪泥”...
  6. DDOS攻击如何防御
  7. Mac-wifi密码破解 2020-04-30
  8. 1.12 Cubemx_STM32F4 步进电机(四)----S曲线理论
  9. java视频生成缩略图_Java中使用ffmpeg生成视频缩略图
  10. [超详细] 2021支付宝集五福【攻略】来了-附自动化脚本