【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. 求解 验证
随机推荐
- CSS选择器之基本选择器总结
一.元素选择器(所有浏览器支持) 元素选择器(标签名选择器)其实就是文档的元素,如html,body,p,div等等, 下面例子中选择了span元素,并设置了字体颜色为红色. <body> ...
- 现代JavaScript函数库 usuallyjs 的安装和使用
usuallyjs usuallyjs 是一个面向现代 Web 开发的 JavaScript 实用函数库. usuallyjs 基于 ES6 开发,抛弃了传统 Web 开发中 DOM 和 BOM 操作 ...
- 《React Native 精解与实战》书籍连载「React 与 React Native 简介」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- TRIO-basic指令--函数FUNCTION
TRIO-basic支持函数(强类型)编程,与PLC来相比较的话类似于定义的功能块可以重复调用,和C,C#......等一些高级的编程语言的函数类似.上一次的demo中决定尝试TRIO的函数来做一些例 ...
- Python学习第十三篇——函数的深层次运用
def make_pizza(size,*toppings): print("\nmaking a "+str(size)+" size pizza with follo ...
- iOS NSDictionary JSON 相互转换
/*! * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonString JSON格式的字符串 * @return 返回字典 */ + (NSDictionary * ...
- Linux sed使用方法
目录 sed处理流程 测试数据 sed命令格式 sed命令行格式 行定位 定位1行 定位区间行(多行) 定位某一行之外的行 定位有跨度的行 操作命令 -a (新增行) -i(插入行) -c(替代行) ...
- 2019省赛训练组队赛3.26周二---FJUT 2016
A.Minimum’s Revenge There is a graph of n vertices which are indexed from 1 to n. For any pair of di ...
- nginx 1.4.3能直接升到1.8.1吗
nginx 1.4.3能直接升到1.8.1吗_百度知道https://zhidao.baidu.com/question/564529441847261484.html nginx-1.6.3平滑升级 ...
- 非常详细的Docker学习教程
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...