高斯-塞德尔方法解方程组

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    double a[3][3]= {{9,-2,1},{1,-8,1},{2,-1,-8}};//系数矩阵
    double b[3]= {6,-8,9};//方程组结果矩阵
    double chg[3][3];//变换后的系数矩阵
    double emax=0.0001;//精确度,根据要求更改

    //变换系数矩阵,用以初始化chg[][].
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<2; j++)
        {

            if(j>=i)
                chg[i][j]=-a[i][j+1]/a[i][i];
            else
                chg[i][j]=-a[i][j]/a[i][i];

        }
        chg[i][2]=b[i]/a[i][i];
    }

    //为了节省空间,将迭代结果存入方程组结果矩阵b[]中
    double tem[3];//临时矩阵用来计算迭代的结果b[].
    double comp[3];//存储b[i-1],用来与b[]做差达到要求精度

    for(int i=0; i<3; i++)//初始化b[]
        b[i]=0;
    int se;
    for( se=0; se<1000; se++)//开始迭代求结果,为了防止出现不收敛的情况,设迭代次数上限1000次
    {
        for(int i=0; i<3; i++)//初始化tem[]和comp[]
        {
            tem[i]=0;
            comp[i]=b[i];
        }

        //以下二重循环用来求迭代一次的结果存入b[]
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<2; j++)
            {
                if(i>j)
                    tem[i]+=chg[i][j]*b[j];
                else     //j>=i
                    tem[i]+=chg[i][j]*b[j+1];
            }
            tem[i]+=chg[i][2];
            b[i]=tem[i];

        }

        int cal=0;
        for(int i=0; i<3; i++)//比较是否达到要求精度emax
        {
            if(fabs(comp[i]-b[i])<emax)
                cal++;
        }

        if(cal>=3)//即b[3]中每个值都满足精度要求
            break;

    }
    if(se==100) cout<<"迭代100次还未达到指定精度要求,可能是不收敛"<<endl<<"此时的结果是:";
    for(int i=0; i<3; i++)//输出显示
        cout<<"x["<<i+1<<"]="<<b[i]<<endl;

    return 0;
}
时间: 2024-10-22 01:54:49

高斯-塞德尔方法解方程组的相关文章

杜立特尔法解方程组

试编出下列子程序: (1)实现矩阵三角分解A=LU: (2)利用分解因子L,U解方程组AX=b(即先求解LY=b 再求解UX=Y)的子程序. 利用上述子程序解线性方程组AX=bk(k=1,2,-,10),其中 A=1  2 4  7  11  16 2 3  5  8 12  17 4 5  6  9 13  18 7 8  9  10 14 19 11 12 13 14 15  20 16 17 18 19 20  21 b1为任一非零的六元向量:若记Xk为AX= bk的解向量,则取bk+1=

三种迭代法解方程组(雅可比Jacobi、高斯-赛德尔Gaisi_saideer、逐次超松弛SOR)

分析用下列迭代法解线性方程组 4 -1 0 -1 0 0       0 -1 4 -1 0 -1 0        5 0 -1 4 -1 0 -1        -2 -1 0 -1 4 -1 0        5 0 -1 0 -1 4 -1        -2 0 0 -1 0 -1 4         6 的收敛性,并求出使||Xk+1-Xk||2<=0.0001的近似解及相应的迭代次数. (1)     雅可比迭代法: (2)     高斯-赛德尔迭代法: (3)     SOR迭代

哥德尔,图灵和康托尔 part 2 停机问题

图灵著名的停机问题对于软件开发者而已是非常熟悉的.下面简单描述停机问题: 假设给你一个计算机程序的源代码,也给你所有程序要用的数据,文件,硬盘,DVD等等,所有它需要处理的东西.你能告诉我程序最终是否能够输出我们需要的结果吗,并且在工作完成之后,程序是就退出,还是会永远运行下去不会停止呢?换句话所就是,对于它会不会停止这个问题, 检查程序和数据,是不是足以能够让你回答是或否呢? 图灵对于停机问题不可解决的证明是决定性的.没有一个软件仅靠检查另一个软件的源代码,就能够决定它是否会停止运行,还是会永

【poj1830-开关问题】高斯消元求解异或方程组

第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任务是,计算有多少种可以达到指定状态的方法.(不计开关操作的顺序)0<=N<=29 我们用样例来模拟一下: 我的高斯消元求解异或方程组模版: 1 int gauss

哥德尔不完备定理

自从牛顿用物理的直觉,闯进无穷领域里大胆计算,铸造出犀利无比的分析工具后,许多人凭借着直观想象和聪明,也涌进去推导出许多互相冲突的结论,数学家花了两百多年的时间,才厘清了分析领域里的混乱,将整个数学建立在严格逻辑,而不是直观想象的基础上. 欧几里德几何一直是科学理论的范本,四条自明性的公理加上一条平行公设,通过逻辑演绎,推导出平面几何无穷数量的定理,一直到了近代还只有几何,被认为是具有坚实基础的数学分支,在这光辉的榜样下,人们尝试用这公理化的方法来规范整个数学,人们后来发现欧几里德也不够严谨,逻

哥德尔,图灵和康托尔

在看计算理论相关的书的时候,偶然看到这个blog,http://skibinsky.com/godel-turing-and-cantor-the-math/,写的很好.我觉得用自动机的方式讲计算理论的话,从DFA,正则,到图灵机,都是很直观而且容易理解的,但是从Halt, Reducibility开始,再用图灵机的语言来描述就是一件可怕而且容易令人迷惑的方式了.这个时候通常不得不退回去,尝试从Lambda Calculus的角度去理解计算理论.不过 Recursion 的符号确实也很讨厌.如果

哥德尔-----------------

以前崇拜物理,因为逻辑简单.讨厌数学,因为物理才能给数学带来利益. 到了大学,然后就垮了.就像天书, 紧接着,其他需要数学的地方,就同时垮了.然后形成了一个大轮回.回到起点,数学是一个哲学问题.一直到现在,还是一团浆糊.凭借网络的力量,数学理解力上升,哲学思想上升.然后带动其他相关领域. 会编程了.但是数学根基很浅显. 只是命好,编程只需要理解力,底层别人都已经给你搞好了,只需要调用. 哥德尔,的牛逼的地方,在于用数学推演上帝的存在.并得出哥德尔不完备定理. 所以数学也等同于推演.但是推演有极限

数学-线性代数-#1 表示及解方程组的新视角

线性代数-#1 表示及解方程组的新视角 学习线性代数之前,我们解n元一次方程组的方法(消元法)着眼于行,把每一行当成一个独立的整体进行处理,最后将各行联系起来求解. 而线性代数为我们提供了一个新视角:着眼于列. 以二元一次方程组为例,即把方程组表示为系数x乘以未知数x的系数组成的列向量v1与系数y乘以未知数y的系数组成的列向量v2通过平行四边形/三角形法则相加后得到方程组每一行的常数项所组成的列向量v3. 在这个视角下,我们可以发现: 1.代数学中的方程组可以通过向量的画法表示为几何学中的列图像

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: (1) 1. 实现该方程的解的MATLAB代码可以分为两种,一种是入门级别的,只是简单地计算出这道题即可,第二种是一种通用的代码,可以实现很多3x3矩阵的方程解,写好以后只需要改不同矩阵里的元素即可算出相应的解,需要建立在对MATLAB比较熟悉的基础上,具体如下: 第一种代码实现-入门级: A=[3