【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. 求解 验证
随机推荐
- Feature Extractor[batch normalization]
1 - 背景 摘要:因为随着前面层的参数的改变会导致后面层得到的输入数据的分布也会不断地改变,从而训练dnn变得麻烦.那么通过降低学习率和小心地参数初始化又会减慢训练过程,而且会使得具有饱和非线性模型 ...
- mysql查询表结果排序
要求:将数据表tab1中DeviceName为‘XI003’,'DO107'的数据放在查询结果的前面,同时对其他查询结果进行降序排序 sql语句: SELECT DISTINCT DeviceName ...
- Materialized View模式
Materialized-View模式是在要求数据格式不利于查询操作的情况下,根据多个数据仓库的数据生成预生成的视图的一种模式.这种模式可以帮助支持高效的查询和数据提取,提高应用程序的性能. 问题 在 ...
- JS表格分页(封装版)
HTML代码: <html> <head> <meta charset='utf-8'> <script type="text/javascript ...
- .NET Core Community 第二个千星项目诞生:Util
本文所有打赏将全数捐赠于 NCC(NCC 的资金目前由 倾竹大人 负责管理),请注明捐赠于 NCC.捐赠情况将由倾竹大人另行公示. 项目简介 作为一款旨在提升小型团队开发输出能力.提高团队效率.降低项 ...
- 程序员修仙之路- CXO让我做一个计算器!!
菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除 ...
- 关于NETCORE中使用特性Serializable找不到引用的解决方法
升级到netcore后,serializable特性不在命名空间System下了,需要nuget依赖包System.Runtime.Serialization.Formatters
- koa服务器搭建基础
之前我一直使用rails搭建网站.rails与koa的基本理念很相似,都是基于中间件提供一层层的服务.所不同的是,rails有很多内置的中间件,这使得开发者只需要关注MVC模块以及页面路由.而Koa这 ...
- 网络编程-C/S架构
什么是C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),本章的重点就是教大家写一个C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 计算机基础知识 作为应用 ...
- spring aop学习记录
许多AOP框架,比较常用的是Spring AOP 与AspectJ.这里主要学习的Spring AOP. 关于AOP 日志.事务.安全验证这些通用的.散步在系统各处的需要在实现业务逻辑时关注的事情称为 ...