【C/C++】求解线性方程组的雅克比迭代与高斯赛德尔迭代
雅克比迭代:
/*
方程组求解的迭代法:
雅克比迭代
*/ #include<bits/stdc++.h>
using namespace std; double A[][];
double re[];
void swapA(int i,int j,int n){
//交换第i行与第j行
for(int x = ;x<=n;x++) {
double temp = A[i][x];
A[i][x] = A[j][x];
A[j][x] = temp;
}
} void getResult(int n,double e,int N){
//n个未知参数
for(int i = ;i<n;i++){
//初始化
re[i] = 0.0;
}
//先检验对角线元素是否为0,如果为0则交换某两列
//什么时候会交换失败?
for(int i = ;i<n;i++) {
if(fabs(A[i][i]-)<=1e-){
//如果第i行对角元素等于0
//找第i列不为0的一列与其交换
int j;
for(j = ;j<n;j++){
if(fabs(A[j][i]-)>1e-){
swapA(i,j,n);
break;
}
}
if(j>=n){
printf("系数矩阵不合法!\n");
}
i = ;//每次从头找
}
}
for(int i = ;i<n;i++) {
for(int j = ;j<n+;j++){
printf("%lf ",A[i][j]);
}
cout<<endl;
} //下面迭代
int k = ;
double x[];
//初始化x[i];
for(int i = ;i<n;i++){
x[i] = 0.0;
}
while(k<=N){
k++;
if(k>N) {
printf("迭代失败!\n");
exit();
}
for(int i = ;i<n;i++){
re[i] = A[i][n];
for(int j = ;j<n;j++){
if(j!=i){
re[i] = re[i] - A[i][j]*x[j];
}
}
re[i] = re[i] / A[i][i];
}
//当最大的x误差小于e则退出
double maxXerror = 0.0;
for(int i = ;i<n;i++){
if(fabs(x[i]-re[i]) >maxXerror){
maxXerror = fabs(x[i] - re[i]);
}
}
if(maxXerror < e){
return;
}
printf("第%d步迭代结果:",k);
for(int i = ;i<n;i++) {
printf("%lf ",re[i]);
}
cout<<endl;
//否则,继续
for(int i = ;i<n;i++){
x[i] = re[i];
}
}
} int main() {
printf("--------雅克比迭代--------\n\n");
int x,y;
cout<<"输入未知数个数与方程个数:";
cin>>x>>y;
if(x!=y) {
cout<<"超定或欠定!"<<endl;
return ;
}
//输入增广矩阵
printf("输入增广矩阵:\n");
for(int i = ;i<x;i++){
for(int j = ;j<x+;j++){
cin>>A[i][j];
}
}
//double re[10];
cout<<"输入精度e和最大迭代次数:" ;
double e;
int N;
cin>>e>>N;
getResult(x,e,N);
for(int i = ;i<x;i++){
cout<<re[i]<<" ";
}
}
/*
输入增广矩阵:
10 -1 -2 7.2
-1 10 -2 8.3
-1 -1 5 4.2
输入精度e和最大迭代次数:0.01 100
*/
/*
输入未知数个数与方程个数:4 4
输入增广矩阵:
10 0 1 -5 -7
1 8 -3 0 11
3 2 -8 1 23
1 -2 2 7 17
输入精度e和最大迭代次数:0.01 100
10.000000 0.000000 1.000000 -5.000000 -7.000000
1.000000 8.000000 -3.000000 0.000000 11.000000
3.000000 2.000000 -8.000000 1.000000 23.000000
1.000000 -2.000000 2.000000 7.000000 17.000000
0
1
2
3
4
5
6
7
8
0.998994 0.501136 -1.9985 2.99615
--------------------------------
*/
//当主对角有0
/*
输入未知数个数与方程个数:4 4
输入增广矩阵:
1 8 -3 0 11
10 0 1 -5 -7
3 2 -8 1 23
1 -2 2 7 17
输入精度e和最大迭代次数:0.01 100
10.000000 0.000000 1.000000 -5.000000 -7.000000
1.000000 8.000000 -3.000000 0.000000 11.000000
3.000000 2.000000 -8.000000 1.000000 23.000000
1.000000 -2.000000 2.000000 7.000000 17.000000
0
1
2
3
4
5
6
7
8
0.998994 0.501136 -1.9985 2.99615 */
G-S迭代:
/*
G-S迭代:
*/
#include<bits/stdc++.h>
using namespace std; double A[][];
double re[];
void swapA(int i,int j,int n){
//交换第i行与第j行
for(int x = ;x<=n;x++) {
double temp = A[i][x];
A[i][x] = A[j][x];
A[j][x] = temp;
}
} void getResult(int n,double e,int N){
//n个未知参数
for(int i = ;i<n;i++){
//初始化
re[i] = 0.0;
}
//先检验对角线元素是否为0,如果为0则交换某两列
//什么时候会交换失败?
for(int i = ;i<n;i++) {
if(fabs(A[i][i]-)<=1e-){
//如果第i行对角元素等于0
//找第i列不为0的一列与其交换
int j;
for(j = ;j<n;j++){
if(fabs(A[j][i]-)>1e-){
swapA(i,j,n);
break;
}
}
if(j>=n){
printf("系数矩阵不合法!\n");
}
i = ;//每次从头找
}
}
for(int i = ;i<n;i++) {
for(int j = ;j<n+;j++){
printf("%lf ",A[i][j]);
}
cout<<endl;
} //下面迭代
int k = ;
double x[];
//初始化x[i];
for(int i = ;i<n;i++){
x[i] = 0.0;
}
while(k<=N){
// printf("%d\n",k);
k++;
if(k>N) {
printf("迭代失败!\n");
exit();
}
for(int i = ;i<n;i++){
re[i] = A[i][n];
for(int j = ;j<i;j++){
re[i] = re[i] - A[i][j]*re[j];
}
for(int j = i+;j<n;j++){
re[i] = re[i] - A[i][j]*x[j];
}
re[i] = re[i] / A[i][i];
}
//当最大的x误差小于e则退出
double maxXerror = 0.0;
for(int i = ;i<n;i++){
if(fabs(x[i]-re[i]) >maxXerror){
maxXerror = fabs(x[i] - re[i]);
}
}
if(maxXerror < e){
return;
}
printf("第%d步迭代结果:",k);
for(int i = ;i<n;i++) {
printf("%lf ",re[i]);
}
cout<<endl;
//否则,继续
for(int i = ;i<n;i++){
x[i] = re[i];
}
}
} int main() {
printf("--------G-S迭代--------\n\n");
int x,y;
cout<<"输入未知数个数与方程个数:";
cin>>x>>y;
if(x!=y) {
cout<<"超定或欠定!"<<endl;
return ;
}
//输入增广矩阵
printf("输入增广矩阵:\n");
for(int i = ;i<x;i++){
for(int j = ;j<x+;j++){
cin>>A[i][j];
}
}
//double re[10];
cout<<"输入精度e和最大迭代次数:" ;
double e;
int N;
cin>>e>>N;
getResult(x,e,N);
printf("解是:\n");
for(int i = ;i<x;i++){
cout<<re[i]<<" ";
}
}
//相同的精度,G-S需要6次,而雅克比需要9次
/*
输入未知数个数与方程个数:4 4
输入增广矩阵:
10 0 1 -5 -7
1 8 -3 0 11
3 2 -8 1 23
1 -2 2 7 17
输入精度e和最大迭代次数:0.01 100
10.000000 0.000000 1.000000 -5.000000 -7.000000
1.000000 8.000000 -3.000000 0.000000 11.000000
3.000000 2.000000 -8.000000 1.000000 23.000000
1.000000 -2.000000 2.000000 7.000000 17.000000
0
1
2
3
4
5
6
0.999337 0.500458 -2.00027 3.0003
--------------------------------
*/
【C/C++】求解线性方程组的雅克比迭代与高斯赛德尔迭代的更多相关文章
- 雅克比迭代算法(Jacobi Iterative Methods) -- [ mpi , c++]
雅克比迭代,一般用来对线性方程组,进行求解.形如: \(a_{11}*x_{1} + a_{12}*x_{2} + a_{13}*x_{3} = b_{1}\) \(a_{21}*x_{1} + a_ ...
- 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- matlab 求解线性方程组之LU分解
线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...
- python 求解线性方程组
Python线性方程组求解 求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了.比如我们要求以下方程的解,这是一个非齐次线性方程组: 3x_1 + x_2 - ...
- Numpy库进阶教程(一)求解线性方程组
前言 Numpy是一个很强大的python科学计算库.为了机器学习的须要.想深入研究一下Numpy库的使用方法.用这个系列的博客.记录下我的学习过程. 系列: Numpy库进阶教程(二) 正在持续更新 ...
- matlab中求解线性方程组的rref函数
摘自:http://www.maybe520.net/blog/987/ matlab中怎么求解线性方程组呢? matlab中求解线性方程组可应用克拉默法则(Cramer's Rule)即通过det( ...
- [Matlab]求解线性方程组
转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方 ...
- Numpy计算逆矩阵求解线性方程组
对于这样的线性方程组: x + y + z = 6 2y + 5z = -4 2x + 5y - z = 27 可以表示成矩阵的形式: 用公式可以表示为:Ax=b,其中A是矩阵,x和b都是列向量 逆矩 ...
- Numpy求解线性方程组
Numpy求解线性方程组 对于Ax=b,已知A和b,怎么算出x? 1. 引入包 2. 求解 验证
随机推荐
- Generative Adversarial Nets[Wasserstein GAN]
本文来自<Wasserstein GAN>,时间线为2017年1月,本文可以算得上是GAN发展的一个里程碑文献了,其解决了以往GAN训练困难,结果不稳定等问题. 1 引言 本文主要思考的是 ...
- Sql Server利用游标批量清空数据表
先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该 ...
- 跨界 - Omi 发布多端统一框架 Omip 打通小程序与 Web
Omip 今天,Omi 不仅仅可以开发桌面 Web.移动 H5,还可以直接开发小程序!直接开发小程序!直接开发小程序! Github Omi 简介 Omi 框架是微信支付线研发部研发的下一代前端框架, ...
- 一款优秀的前端框架——AngularJS
前 言 AngularJS是一款为了克服HTML在构建应用上的不足而设计的优秀的前端JS框架.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注 ...
- webpack打包经验——处理打包文件体积过大的问题
前言 最近对一个比较老的公司项目做了一次优化,处理的主要是webpack打包文件体积过大的问题. 这里就写一下对于webpack打包优化的一些经验. 主要分为以下几个方面: 去掉开发环境下的配置 Ex ...
- poj3984 广度搜索BFS
迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1 ...
- 学习mongoDB的一些感受(转自:http://blog.csdn.net/liusong0605/article/details/11581019)
曾经使用过mongoDB来保存文件,最一开始,只是想总结一下在开发中如何实现文件与mongoDB之间的交互.在此之前,并没有系统的了解过mongoDB,虽然知道我们用它来存储文件这些非结构化数据,但是 ...
- 【转】Linux下cp: omitting directory `XXX'问题解决
在linux系统中复制文件夹时提示如下: Shell代码 [root@idtp4 site-packages]# /site-packages/ cp: omitting directory ‘yag ...
- shell脚本--初识CGI
CGI按照百度百科的定义,如下: CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能.CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数 ...
- centos yum install oracle java
How to install Java on CentOS 7 | Linuxizehttps://linuxize.com/post/install-java-on-centos-7/ CentOS ...