雅克比迭代:

 /*
方程组求解的迭代法:
雅克比迭代
*/ #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++】求解线性方程组的雅克比迭代与高斯赛德尔迭代的更多相关文章

  1. 雅克比迭代算法(Jacobi Iterative Methods) -- [ mpi , c++]

    雅克比迭代,一般用来对线性方程组,进行求解.形如: \(a_{11}*x_{1} + a_{12}*x_{2} + a_{13}*x_{3} = b_{1}\) \(a_{21}*x_{1} + a_ ...

  2. 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  3. matlab 求解线性方程组之LU分解

    线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...

  4. python 求解线性方程组

    Python线性方程组求解 求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了.比如我们要求以下方程的解,这是一个非齐次线性方程组: 3x_1 + x_2 - ...

  5. Numpy库进阶教程(一)求解线性方程组

    前言 Numpy是一个很强大的python科学计算库.为了机器学习的须要.想深入研究一下Numpy库的使用方法.用这个系列的博客.记录下我的学习过程. 系列: Numpy库进阶教程(二) 正在持续更新 ...

  6. matlab中求解线性方程组的rref函数

    摘自:http://www.maybe520.net/blog/987/ matlab中怎么求解线性方程组呢? matlab中求解线性方程组可应用克拉默法则(Cramer's Rule)即通过det( ...

  7. [Matlab]求解线性方程组

    转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方 ...

  8. Numpy计算逆矩阵求解线性方程组

    对于这样的线性方程组: x + y + z = 6 2y + 5z = -4 2x + 5y - z = 27 可以表示成矩阵的形式: 用公式可以表示为:Ax=b,其中A是矩阵,x和b都是列向量 逆矩 ...

  9. Numpy求解线性方程组

    Numpy求解线性方程组 对于Ax=b,已知A和b,怎么算出x? 1. 引入包 2. 求解 验证

随机推荐

  1. EntityFramework Core问题处理集锦(一)

    前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...

  2. .NetCore简单学习图谱

    一.学习途径 学习.netcore的最佳途径在哪里,无疑是微软官方.netCore指南.它覆盖十分全面,就目前网上经常看到的各种文章都能在微软处找到类似文章,堪称.netcore的百科全书.所以我利用 ...

  3. 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    Spring Security功能多,组件抽象程度高,配置方式多样,导致了Spring Security强大且复杂的特性.Spring Security的学习成本几乎是Spring家族中最高的,Spr ...

  4. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 用户密码安全增强

    系统的用户密码是有多少重要大家应该心里都有数,一个系统的密码若是大批量泄露,哪怕是少数几个人密码泄露了,都是致命的. 1: 系统里不要保存明文密码,那是引诱人家犯罪.2: 首先防范的不是外鬼,先需要防 ...

  5. elasticsearch开启外网访问

    默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成 ...

  6. Leetcode 中Linked List Cycle 一类问题

    141. Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you sol ...

  7. Unix / Linux 线程的实质

    线程与进程的比较 概述: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小 ...

  8. 建立一个单链表,并删除链表中值为W的元素

    #include<iostream> #include<algorithm> #include<string.h> #include<stdio.h> ...

  9. pdf中内嵌字体问题

    在提交论文pdf到IEEE时总要检查字体是否为内嵌的,查看pdf中所有字体及是否内嵌可查看:http://sinme.blog.sohu.com/120043575.html. 具体做法是: 在pdf ...

  10. 使用PHPExcel导出数据库表结构及内容

    导出表结构: mysql> desc user ; +----------+--------------+------+-----+---------------------+--------- ...