SOR迭代法,又名逐次超松弛迭代法,与Jacobi迭代法和Guass-Seidel迭代法相比,收敛速度更快其原理如下(想详细了解,可以点击这里数值分析(东北大学)):
1.构造迭代式时,要加上一个大于0的松弛因子w,这样可以加快其收敛速度

2.根据上式进行分析:

3.得到迭代式:

得到迭代式以后,就可以选择合适的初始解进行计算了,由于迭代法的收敛性与初始向量无关,与系数矩阵的谱半径有关,所以在计算时的初始解向量不妨设为0向量即可

代码实现

1.初始化:

double** init_Matrix(int r, int c)
{double** p = new double* [r];int d = c + 1;for (int i = 0; i < r; i++){p[i] = new double[d];memset(p[i], 0, sizeof(double) * d);}cout << "请输入线性方程组对应的增广矩阵:" << endl;for (int i = 0; i < r; i++){for (int j = 0; j < d; j++){cin >> p[i][j];}}cout << "请输入SOR的松弛因子w(0<w):" << endl;while (!(cin >> w)||(cin.fail())){if (w>0){break;}else{cin.clear();cin.sync();cout << "输入不规范的w,请重新输入!" << endl;}}return p;
}

2.判断是否达到精度要求:

bool isRight(double** p, int r, double* x)
{double sum1 = 0, flag = 0, sum2 = 0;for (int i = 0; i < r; i++){sum1 = 0, flag = 0;for (int j = 0; j < r; j++){sum1 += x[j] * p[i][j];}flag = fabs(p[i][r] - sum1);if (flag > one_Precision)//解代入单个方程式的误差过大{return false;}else{sum2 += flag;}}if (sum2 > total_Precision)//整体误差过大{return false;}return true;
}

3.迭代计算:

void Iteration(double** p, int r, double* x)
{int k = 0;//迭代次数double sum = 0,tmp=0;while (true){for (int i = 0; i < r; i++){sum = 0,tmp=0;for (int j = 0; j < r; j++){if (j == i){tmp -= x[j];}else{sum -= p[i][j] * x[j];}}x[i] = x[i]+w*((p[i][r] + sum) / p[i][i])+w*tmp;}printf("第%d次迭代结果为:", ++k);for (int i = 0; i < r; i++){printf("%f\t", x[i]);}cout << endl;if (k >= MAX_time){cout << "超出迭代次数上限!停止迭代" << endl;return;}if (isRight(p, r, x))//精度符合要求{cout << "精度符合要求,停止迭代,共迭代:" << k << "次" << endl;return;}}
}

完整代码:

#include<iostream>
#include<Windows.h>
#include<math.h>
#define one_Precision   1e-5//单个方程误差
#define total_Precision 3e-5//整体方程误差
#define MAX_time  1000//最大迭代次数
using namespace std;
/*
3 3
10 -1  0 9
-1 10 -2 7
0  -2 10 63 3
3 2 -3 -2
1 1  1  6
1 2 -1  23 3
1  2 -3 1
2 -1  3 5
3 -2  2 14 4
4 -3  6  7 11
1  1  3  4 10
-2 9 -7  1 10
3  3 -4 20 25
*/
double w =0;//先赋初始值为0 避免访问到未处理的内存 计算时要求进行输入
double** init_Matrix(int r, int c)
{double** p = new double* [r];int d = c + 1;for (int i = 0; i < r; i++){p[i] = new double[d];memset(p[i], 0, sizeof(double) * d);}cout << "请输入线性方程组对应的增广矩阵:" << endl;for (int i = 0; i < r; i++){for (int j = 0; j < d; j++){cin >> p[i][j];}}cout << "请输入SOR的松弛因子w(0<w):" << endl;while (!(cin >> w)||(cin.fail())){if (w>0){break;}else{cin.clear();cin.sync();cout << "输入不规范的w,请重新输入!" << endl;}}return p;
}
bool isRight(double** p, int r, double* x)
{double sum1 = 0, flag = 0, sum2 = 0;for (int i = 0; i < r; i++){sum1 = 0, flag = 0;for (int j = 0; j < r; j++){sum1 += x[j] * p[i][j];}flag = fabs(p[i][r] - sum1);if (flag > one_Precision)//解代入单个方程式的误差过大{return false;}else{sum2 += flag;}}if (sum2 > total_Precision)//整体误差过大{return false;}return true;
}
void Iteration(double** p, int r, double* x)
{int k = 0;//迭代次数double sum = 0,tmp=0;while (true){for (int i = 0; i < r; i++){sum = 0,tmp=0;for (int j = 0; j < r; j++){if (j == i){tmp -= x[j];}else{sum -= p[i][j] * x[j];}}x[i] = x[i]+w*((p[i][r] + sum) / p[i][i])+w*tmp;}printf("第%d次迭代结果为:", ++k);for (int i = 0; i < r; i++){printf("%f\t", x[i]);}cout << endl;if (k >= MAX_time){cout << "超出迭代次数上限!停止迭代" << endl;return;}if (isRight(p, r, x))//精度符合要求{cout << "精度符合要求,停止迭代,共迭代:" << k << "次" << endl;return;}}
}
void SOR_main()
{int i = 0, j = 0;cout << "请输入线性方程组对应系数矩阵的行和列:" << endl;cin >> i >> j;double** p = init_Matrix(i, j);double* X = new double[i];//第n+1次跌代memset(X, 0, sizeof(double) * i);Iteration(p, i, X);for (int i = 0; i < j; i++){delete[]p[i];}delete[]p;delete[]X;
}
int main(void)
{SOR_main();system("pause");return 0;
}

数值分析线性方程组迭代法之SOR迭代法详解及其C语言算法实现相关推荐

  1. c语言写程序if else,if else用法详解,C语言if else用法完全攻略

    if else 语句是一种选择结构,可以让代码选择执行.所谓选择执行,就是"某些代码可能执行,也可能不执行,有选择地执行某些代码". if 的最简单用法 if最简单的格式是: if ...

  2. 深度 | 详解可视化利器t-SNE算法:数无形时少直觉

    T 分布随机近邻嵌入(T-Distribution Stochastic Neighbour Embedding)是一种用于降维的机器学习方法,它能帮我们识别相关联的模式.t-SNE 主要的优势就是保 ...

  3. 图之邻接矩阵详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 图的邻接矩阵是一种采用邻接矩阵数组表示顶点之间相邻关系的存储结构.设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:       ...

  4. 我赢助手详解抖音推荐算法的底层逻辑,视频是怎样从零开始到爆款的?

    我赢助手详解抖音推荐算法的底层逻辑,视频是怎样从零开始到爆款的? 话不多数,直接上干货,看看抖音推荐机制是怎么处理视频的. 1.视频上传 视频上传后,第一时间先经过机器审核,主要包括:图像识别.音频识 ...

  5. C语言return的用法详解,C语言函数返回值详解。 (本次转载仅供学习,感谢原创!!转发自C语言中文网,如有侵权请私信本人删除)

    C语言return的用法详解,C语言函数返回值详解 转载:http://c.biancheng.net/view/1855.html 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这 ...

  6. Subspace Clustering详解(附带CLIQUE算法详解)

    Subspace Clustering详解 第二十四次写博客,本人数学基础不是太好,如果有幸能得到读者指正,感激不尽,希望能借此机会向大家学习.这一篇作为密度聚类算法族的第三篇,主要是介绍一种用来发现 ...

  7. 图遍历详解(C语言版)

    文章目录 一.定义 二.方法 1.深度优先遍历 2.广度优先遍历 三.实现 1.无向图或强连通有向图遍历 2.非连通图遍历 结语 附录 一.定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜 ...

  8. 极智AI | 量化实现分享二:详解 KL 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 K ...

  9. 图之邻接表详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 四.测试 结语 附录 一.定义 图的邻接表是一种顺序与链式存储相结合的存储方式.下面给出一个示例,以便大家能够理解邻接表这种存储方式:         无向 ...

最新文章

  1. 报名 | AI Time :论道AI安全与伦理
  2. (四)OpenStack---M版---双节点搭建---Glance安装和配置
  3. 多核服务器的JVM优化选项(转载)
  4. 2021 4 21 管理心得
  5. android 动态修改控件的宽高
  6. 使用安全Cookies-笔记
  7. 剑指offer之反向打印链表值
  8. php 淘宝客接口开发,如何使用PHP的curl函数调用维易淘客接口
  9. 高中python公开课怎么上好_如何上好高中英语公开课
  10. 信息学奥赛一本通 1038:苹果和虫子 | OpenJudge NOI 1.3 15 | OpenJudge NOI 1.4 21
  11. Bean的装配方式之xml装配--(超详细,适合小白入门)
  12. Oracle备份恢复之闪回技术
  13. 金山发布数字办公平台
  14. 全连接简单minist操作
  15. html 引入 icon 图标
  16. Testbed单元测试
  17. SU插件|实时联动Lumion LiveSync for SketchUp免费下载(渲染器与草图大师模型同步更新)
  18. ios逆向工具tweak logos语法总结
  19. GPU显存占满利用率GPU-util为0
  20. Eclipse全局搜索 文件搜索 IDEA全局搜索 快捷键Ctrl+Shit+F冲突 Ctrl+Alt+0 全局查询

热门文章

  1. SAP HANA NSE
  2. 网易云Web安全工程师课程分享2——第二章 常见Web漏洞解析
  3. 做存储双活是好,但不能白白浪费了存储阵列软件
  4. Anaconda在Ubuntu下的安装与简单使用
  5. “区块链60人”2022赋能中国区块链创新人物名单公布
  6. 连接服务器失败请与系统管理员联系,帮助_不能连接到服务器。本地端口被禁止,请与本地网络管理员联系。(访问端口:5005)_鹏保宝...
  7. iOS4.3.5降级到4.3.3,及越狱教程
  8. 不撞南墙不回头----------深度优先搜索
  9. [IDEA]报错:类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。
  10. 物流APP开发同城速递第一品牌,达达向 C 端市场进发