实验5解线性方程组的迭代法

合集下载

大学数学实验报告----迭代(一)——方程求解

大学数学实验报告----迭代(一)——方程求解

Do M n , n, 2, 100
运行结果:
M n_Integer : Module y, k , m 2; k m ^ n 1 ;
x Mod k, n ;
Print n, " ", PrimeQ n , " ", x, "
", GCD m, n
Do M n , n, 2, 100
2 True 0 2 3 True 1 1 4 False 0 2 5 True 1 1 6 False 2 2 7 True 1 1 8 False 0 2 9 False 4 1 10 False 2 2 11 True 1 1 12 False 8 2 13 True 1 1 14 False 2 2 15 False 4 1 16 False 0 2 17 True 1 1 18 False 14 2 19 True 1 1 20 False 8 2 21 False 4 1 22 False 2 2 23 True 1 1 24 False 8 2 25 False 16 1 26 False 2 2 27 False 13 1 28 False 8 2 29 True 1 1 30 False 2 2 31 True 1 1 32 False 0 2 33 False 4 1 34 False 2 2 35 False 9 1 36 False 32 2 37 True 1 1 38 False 2 2 39 False 4 1 40 False 8 2
99 False 3 27 100 False 1 67 Null2
m=4 时
输入程序:
M n_Integer : Module y, k , m 4; k m ^ n 1 ; x Mod k, n ; Print n, " ", PrimeQ n , " ", GCD m, n , " ", x Do M n , n, 2, 100

计算方法-线性方程组的迭代法实验

计算方法-线性方程组的迭代法实验

实验五 线性方程组的迭代法实验一. 实验目的(1)深入理解线性方程组的迭代法的设计思想,学会利用系数矩阵的性质以保证迭代过程的收敛性,以及解决某些实际的线性方程组求解问题。

(2)熟悉Matlab 编程环境,利用Matlab 解决具体的方程求根问题。

二. 实验要求建立Jacobi 迭代公式、Gauss-Seidel 迭代公式和超松弛迭代公式,用Matlab 软件实现线性方程组求解的Jacobi 迭代法、Gauss-Seidel 迭代法和超松弛迭代法,并用实例在计算机上计算。

三. 实验内容1. 实验题目(1)分别利用Jacobi 迭代和Gauss-Seidel 迭代求解下列线性方程组,取()T 0,0,0,0,0,0=x ,要求精度510-=ε:⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---------------626050410100141010014001100410010141001014654321x x x x x x ①Jacobi 迭代:②Gauss-Seidel迭代:(2)分别取1ω、1.05、1.1、1.25和1.8,用超松弛法求解上面的方程组,要求精度=为5ε。

=10-超松弛迭代代码如下所示:运行时初始化如下:分别以不同的松弛因子代入,W=1:W=1.05W=1.1:W=1.25W=1.8:当最大迭代次数增加时,我们可以看到,x向量的各个元素都变无穷大了,迭代发散2. 设计思想要求针对上述题目,详细分析每种算法的设计思想。

求解线性方程组的迭代法,其实质是将所给的方程组逐步地对角化或三角化,即将线性方程组的求解过程加工成对角方程组或三角方程组求解过程的重复。

⑴Jacobi迭代:将一般形式的线性方程组归结为对角方程组求解过程的重复;⑵Gauss-Seidel迭代:将一般形式的线性方程组的求解归结为下三角方程组求解过程的重复;⑶超松弛法:选择合适的松弛因子,利用旧值生成新值,使迭代加速;四.实验体会对实验过程进行分析总结,对比求解线性方程组的不同方法的优缺点,指出每种方法的设计要点及应注意的事项,以及自己通过实验所获得的对线性方程组求解问题的各种解法的理解。

《解线性方程组的VRP-GMRES(m)迭代法》范文

《解线性方程组的VRP-GMRES(m)迭代法》范文

《解线性方程组的VRP-GMRES(m)迭代法》篇一一、引言在科学计算和工程领域,线性方程组的求解是一个重要的研究课题。

传统的解法如高斯消元法、LU分解法等,在处理大规模或复杂问题时往往显得效率低下。

近年来,迭代法因其高效性和适应性,在求解线性方程组中得到了广泛应用。

其中,VRP-GMRES(m)迭代法因其收敛速度快、适用范围广等优点而备受关注。

本文旨在介绍VRP-GMRES(m)迭代法的原理、步骤及其在解线性方程组中的应用。

二、VRP-GMRES(m)迭代法原理VRP-GMRES(m)迭代法是一种基于Krylov子空间的迭代算法,用于求解线性方程组Ax=b。

该方法通过构造一系列的Krylov子空间,逐步逼近解向量x。

与传统的GMRES算法相比,VRP-GMRES(m)在每一步迭代中引入了重启策略和预处理技术,从而提高了算法的稳定性和收敛速度。

三、VRP-GMRES(m)迭代法步骤1. 初始化:选择一个初始向量x0和初始残差r0=b-Ax0。

2. 构建Krylov子空间:通过迭代过程,构建一系列的Krylov 子空间Vn,其中n为迭代次数。

3. 最小二乘问题求解:在每个Krylov子空间中,求解最小二乘问题以获得搜索方向。

4. 重启策略:当达到预设的重启次数m时,重新开始新一轮的迭代过程。

5. 预处理技术:在迭代过程中引入预处理技术,如Jacobi预处理、SOR预处理等,以提高算法的稳定性和收敛速度。

6. 终止条件:当残差满足预设的终止条件时,停止迭代,输出解向量x。

四、VRP-GMRES(m)迭代法在解线性方程组中的应用VRP-GMRES(m)迭代法广泛应用于各种工程和科学计算领域,如流体动力学、电磁场计算、结构力学等。

通过引入重启策略和预处理技术,该方法可以有效地处理大规模、复杂和病态的线性方程组。

与传统的迭代法和直接法相比,VRP-GMRES(m)具有更高的计算效率和更好的稳定性。

此外,该方法还可以根据具体问题的特点进行定制化改进,以满足不同领域的需求。

第五章 解线性方程组的迭代解法

第五章 解线性方程组的迭代解法
i 1 n 1 xi = [bi ∑ aij x j ∑ aij x j ] , i = 1, 2,, n. (*) ) aii j =1 j = i +1
定义迭代法为: 定义迭代法为:
x ( k + 1) = G J x ( k ) + g
其中Jacobi迭代矩阵:GJ = D1 ( L + U ) 迭代矩阵: 其中 迭代矩阵
g = D 1b = (7.2, 8.3, 8.4)T 取 x ( 0 ) = (0, 0, 0)T , 代入迭代式,得x(1) = Bx ( 0 ) + g = (7.2, 8.3, 8.4)T x ( 2 ) = Bx (1) + g = (9.71,10.70,11.5)T x (9 ) = (10.9994,11.9994,12.9992) 精确解为 x = (11,12,13)T .

A = D L U
其中 D = diag (a11 ,, ann ) , L, U 分别为 A 的 严格下、上三角形部分元素构成的三角阵 严格下、上三角形部分元素构成的三角阵. Gauss-Seidel方法的矩阵形式为 方法的矩阵形式为
x ( k +1) = D1 ( Lx ( k +1) + Ux ( k ) + b)
或者
x ( k +1) = ( D L)1Ux ( k ) + ( D L)1 b
( 这说明Gauss-Seidel方法的迭代矩阵为 D L)1U 方法的迭代矩阵为 这说明
从而有
定理5.2 定理5.2 Gauss-Seidel方法收敛的充分必要条件为 方法收敛的充分必要条件为
ρ (GG ) < 1 或

(精校版)迭代法解线性方程组数值分析实验报告

(精校版)迭代法解线性方程组数值分析实验报告

(完整word版)迭代法解线性方程组-数值分析实验报告编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word版)迭代法解线性方程组-数值分析实验报告)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整word版)迭代法解线性方程组-数值分析实验报告的全部内容。

数学与计算科学学院《数值分析》课程设计题目:迭代法解线性方程组专业:信息与计算科学学号: 1309302—24姓名:谭孜指导教师:郭兵成绩:二零一六年六月二十日一、前言:(目的和意义)1.实验目的①掌握用迭代法求解线性方程组的基本思想和步骤.②了解雅可比迭代法,高斯—赛德尔法和松弛法在求解方程组过程中的优缺点。

2。

实验意义迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,它是解高阶稀疏方程组的重要方法。

迭代法的基本思想是用逐次逼近的方法求解线性方程组。

比较雅可比迭代法,高斯—赛德尔迭代方法和松弛法,举例子说明每种方法的试用范围和优缺点并进行比较.二、数学原理:设有方程组b Ax = …① 将其转化为等价的,便于迭代的形式f Bx x += …② (这种转化总能实现,如令b f A I B =-=,), 并由此构造迭代公式f Bx x k k +=+)()1( …③ 式中B 称为迭代矩阵,f 称为迭代向量。

对任意的初始向量)0(x ,由式③可求得向量序列∞0)(}{k x ,若*)(lim x x k k =∞→,则*x 就是方程①或方程②的解。

此时迭代公式②是收敛的,否则称为发散的。

构造的迭代公式③是否收敛,取决于迭代矩阵B 的性 1。

雅可比迭代法基本原理设有方程组),,3,2,1(1n i b x a j j nj ij ==∑= …①矩阵形式为b Ax =,设系数矩阵A 为非奇异矩阵,且),,3,2,1(,0n i a ii =≠从式①中第i 个方程中解出x,得其等价形式)(111j nj j ij ii i x a b a x ∑≠=-= …②取初始向量),,,()0()0(2)0(1)0(n x x x x =,对式②应用迭代法,可建立相应的迭代公式: )(111)()1(∑≠=++-=nj j i k j ij ii k ib x a a x…③ 也可记为矩阵形式:J x J k F B x k +==)()1( …④ 若将系数矩阵A 分解为A=D —L-U ,⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=--=--00000000000000111211212211212222111211n n n nn n nn nn n n n n a a a a a a a a a a a a a a a a a a U L D A式中⎪⎪⎪⎪⎪⎭⎫⎝⎛=nn a a a D2211,⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=-0000121323121nn n n a a a a a a L ,⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=-0000122311312n n n n a a a a a a U 。

线性方程组的迭代式求解方法

线性方程组的迭代式求解方法

线性方程组的迭代式求解方法迭代法解方程的基本原理1.概述把 Ax=b 改写成 x=Bx+f ,如果这一迭代格式收敛,对这个式子不断迭代计算就可以得到方程组的解。

道理很简单:对 x^{(k+1)}=bx^{(k)}+f 两边取极限,显然如果收敛,则最终得到的解满足 \lim_{k\rightarrow\infty } x^{(k)}=x^*=Bx^*+f ,从而必然满足原方程 Ax^*=b 。

迭代方法的本质在于这一次的输出可以当作下一次的输入,从而能够实现循环往复的求解,方法收敛时,计算次数越多越接近真实值。

2.收敛条件充要条件:迭代格式 x=Bx+f 收敛的充要条件是 \rho (B)<1充分条件: \Vert B\Vert <1即 \Vert B\Vert <1 \Rightarrow \rho(B)<1\Leftrightarrow 迭代收敛一、Jacobi迭代法怎样改写Ax=b ,从而进行迭代求解呢?一种最简单的迭代方法就是把第i行的 x_i 分离出来(假定 a_{ii} \ne 0 ):\sum_{j=1}^{n}a_{ij}x_j=b_i\Rightarrow x_i=\frac{b_i-\sum_{j=1,j\ne i}^{n}a_{ij}x_j}{a_{ii}}\quad \\这就是Jacobi(雅可比)迭代法。

迭代格式给定x^{(0)}=\left[x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)}\rig ht]^T ,则Jacobi法的迭代格式(也称分量形式)为x_i^{(k+1)}=\frac{1}{a_{ii}}\left ( {b_i-\sum_{j=1,j\ne i}^{n}a_{ij}x_j^{(k)}}\right),\quadi=1,2,\cdots,n\\矩阵形式设 A=D-L-U。

Jacobi法的矩阵形式(也称向量形式)为x^{(k+1)}=B_Jx^{(k)}+D^{-1}b\\其中迭代矩阵 B_J=D^{-1}(L+U)收敛条件\begin{eqnarray} \left. \begin{array}{lll} \VertB_J\Vert <1 \\ A 严格对角占优\\ A, 2D-A对称正定\end{array} \right \} \end{eqnarray} \Rightarrow \rho (B_J)<1\Leftrightarrow 迭代收敛特别地,若 A 对称正定且为三对角,则 \rho^2(B_J)=\rho (B_G)<1 。

实验五-解线性方程组的迭代法报告

实验五-解线性方程组的迭代法报告

实验五 解线性方程组的迭代法一、问题提出对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。

二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如34510,10,10ε---=由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。

三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(1)k k xx ε+∞-<或k>(给予的迭代次数),对迭代法敛散性的意义;4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。

四、实验学时:2学时五、实验步骤:1.进入C 或matlab 开发环境;2.根据实验内容和要求编写程序;3.调试程序;4.运行程序;5.撰写报告,讨论分析实验结果.解:J迭代算法:程序设计流程图:源程序代码:#include<stdlib.h>#include<stdio.h>#include<math.h>void main(){float a[50][51],x1[50],x2[50],temp=0,fnum=0;int i,j,m,n,e,bk=0;printf("使用Jacobi迭代法求解方程组:\n");printf("输入方程组的元:\nn=");scanf("%d",&n);for(i=1;i<n+1;i++)x1[i]=0;printf("输入方程组的系数矩阵:\n");for(i=1;i<n+1;i++){j=1;while(j<n+1){scanf("%f",&a[i][j]);j++;}}printf("输入方程组的常数项:\n");for(i=1;i<n+1;i++){scanf("%f",&a[i][n+1]);}printf("\n");printf("请输入迭代次数:\n");scanf("%d",&m);printf("请输入迭代精度:\n");scanf("%d",&e);while(m!=0){for(i=1;i<n+1;i++){for(j=1;j<n+1;j++){if (j!=i)temp=a[i][j]*x1[j]+temp;}x2[i]=(a[i][n+1]-temp)/a[i][i];temp=0;}for(i=1;i<n+1;i++){fnum=float(fabs(x1[i]-x2[i]));if(fnum>temp) temp=fnum;}if(temp<=pow(10,-4)) bk=1;for(i=1;i<n+1;i++)x1[i]=x2[i];m--;}printf("原方程组的解为:\n");for(i=1;i<n+1;i++){if((x1[i]-x2[i])<=e||(x2[i]-x1[i])<=e){printf("x%d=%7.4f ",i,x1[i]);}}}运行结果:GS迭代算法:#include<iostream.h>#include<math.h>#include<stdio.h>const int m=11;void main(){int choice=1;while(choice==1){double a[m][m],b[m],e,x[m],y[m],w,se,max; int n,i,j,N,k;cout<<"Gauss-Seidol迭代法"<<endl;cout<<"请输入方程的个数:";cin>>n;for(i=1;i<=n;i++){cout<<"请输入第"<<i<<"个方程的各项系数:"; for(j=1;j<=n;j++)cin>>a[i][j];}cout<<"请输入各个方程等号右边的常数项:\n"; for(i=1;i<=n;i++){cin>>b[i];}cout<<"请输入最大迭代次数:";cin>>N;cout<<"请输入最大偏差:";cin>>e;for(i=1;i<=n;i++){x[i]=0;y[i]=x[i];}k=0;while(k!=N){k++;for(i=1;i<=n;i++){w=0;for(j=1;j<=n;j++){if(j!=i)w=w+a[i][j]*y[j];}y[i]=(b[i]-w)/double(a[i][i]);}max=fabs(x[1]-y[1]);for(i=1;i<=n;i++){se=fabs(x[i]-y[i]);if(se>max)max=se;}if(max<e){cout<<endl;for(i=1;i<=n;i++)cout<<"x"<<i<<"="<<y[i]<<endl; break;}for(i=1;i<=n;i++){x[i]=y[i];}}if(k==N)cout<<"迭代失败!!"<<endl;choice=0;}}SOR方法:# include <stdio.h># include <math.h>#include<stdlib.h>/**********定义全局变量**********/float **a; /*存放A矩阵*/float *b; /*存放b矩阵*/float *x; /*存放x矩阵*/float p; /*精确度*/float w; /*松弛因子*/int n; /*未知数个数*/int c; /*最大迭代次数*/int k=1; /*实际迭代次数*//**********SOR迭代法**********/void SOR(float xk[]){int i,j;float t=0.0;float tt=0.0;float *xl;xl=(float *)malloc(sizeof(float)*(n+1)); for(i=1;i<n+1;i++){t=0.0;tt=0.0;for(j=1;j<i;j++)t=t+a[i][j]*xl[j];for(j=i;j<n+1;j++)tt=tt+a[i][j]*xk[j];xl[i]=xk[i]+w*(b[i]-t-tt)/a[i][i];}t=0.0;for(i=1;i<n+1;i++){tt=fabs(xl[i]-xk[i]);tt=tt*tt;t+=tt;}t=sqrt(t);for(i=1;i<n+1;i++)xk[i]=xl[i];if(k+1>c){if(t<=p)printf("\nReach the given precision!\n"); elseprintf("\nover the maximal count!\n");printf("\nCount number is %d\n",k);}elseif(t>p){k++;SOR(xk);}else{printf("\nReach the given precision!\n"); printf("\nCount number is %d\n",k);}}/**********程序*****开始**********/void main(){int i,j;printf("SOR方法\n");printf("请输入方程个数:\n");scanf("%d",&n);a=(float **)malloc(sizeof(float)*(n+1)); for(i=0;i<n+1;i++)a[i]=(float*)malloc(sizeof(float)*(n+1));printf("请输入三对角矩阵:\n");for(i=1;i<n+1;i++)for(j=1;j<n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<n+1;i++)for(j=1;j<n;j++)b=(float *)malloc(sizeof(float)*(n+1)); printf("请输入等号右边的值:\n");for(i=1;i<n+1;i++)scanf("%f",&b[i]);x=(float *)malloc(sizeof(float)*(n+1)); printf("请输入初始的x:");for(i=1;i<n+1;i++)scanf("%f",&x[i]);printf("请输入精确度:");scanf("%f",&p);printf("请输入迭代次数:");scanf("%d",&c);printf("请输入w(0<w<2):\n");scanf("%f",&w);SOR(x);printf("方程的结果为:\n");for(i=1;i<n+1;i++)printf("x[%d]=%f\n",i,x[i]);}程序运行结果讨论和分析:①迭代法具有需要计算机的存贮单元较少,程序设计简单,原始系数矩阵在计算过程中始终不变等优点.②迭代法在收敛性及收敛速度等方面存在问题.[注:A必须满足一定的条件下才能运用以下三种迭代法之一.在Jacobi中不用产生的新数据信息,每次都要计算一次矩阵与向量的乘法,而在Gauss利用新产生的信息数据来计算矩阵与向量的乘法.在SOR中必须选择一个最佳的松弛因子,才能使收敛加速.]经过计算可知Gauss-Seidel方法比Jacobi方法剩点计算量,也是Jacobi方法的改进.可是精确度底,计算量高,费时间,需要改进.SOR是进一步改进Gauss-Seidel 而得到的比Jacobi,Gauss-Seidel方法收敛速度快,综合性强.改变松弛因子的取值范围来可以得到Jacobi,Gauss-Seidel方法.③选择一个适当的松弛因子是关键.结论:线性方程组1和2对于Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法均不收敛,线性方程组3收敛。

解线性方程组的迭代法

解线性方程组的迭代法
算程序,得到一向量序列和一般的计算公式(迭代公式)
(0) (1) (k ) x1 x1 x1 (0) (1) (k ) (0) (1) (k ) x x2 , x x2 ,, x x2 , x (0) x (1) x(k ) 3 3 3
或写为 x B0 x f , 其中
0 4 B0 11 6 12 3 8 0 3 12 2 8 1 , 11 0 20 8 33 f . 11 36 12
5
( k 1) (k ) (k ) x1 (3 x2 2 x3 20) / 8, x ( k 1) (4 x ( k ) x ( k ) 33) /11, 1 3 2 ( k 1) (k ) (k ) x3 (6 x1 3x2 36) /12.
7
构造迭代法
x1( k 1) 2 x2 ( k ) 5, ( k 1) (k ) x 3 x 5. 1 2
则对任何的初始向量,得到的序列都不收敛.
对于给定方程组 x Bx f, 设有唯一解 x * ,则
x* Bx * f .
(1.5)
又设 x ( 0 ) 为任取的初始向量,按下述公式构造向量序列
4
任取初始值,例如取 x ( 0) (0, 0, 0)T .
将这些值代入(1.3) 式右边 (若(1.3)式为等式即求得
方程组的解,但一般不满足). 得到新的值
(1) (1) (1) T x (1) ( x1 , x2 , x3 ) (2.5, 3, 3)T ,
再将 x (1) 分量代入(1.3)式右边得到 x ( 2 ),反复利用这个计
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西华数学与计算机学院上机实践报告
课程名称:计算方法A
年级: 上机实践成绩: 指导教师:严常龙
姓名: 上机实践名称:解线性方程组的迭代法
学号: 上机实践日期: 上机实践编号:1
上机实践时间:16:00-17:40 一、目的
1.通过本实验加深对Jacobi 迭代法、Gauss-Seidel 迭代法、松弛迭代法的构造过程的理解;
2.能对上述三种迭代法提出正确的算法描述编程实现,进一步理解迭代法的改进过程;
二、内容与设计思想
自选线性方程组,编制一个程序,分别用Jacobi 迭代法、Gauss-Seidel 和松弛迭代法求解,比较三
种迭代法收敛速度的快慢。

三、使用环境
操作系统:Windows XP
软件环境:Microsoft Visual C++
四、核心代码及调试过程
题目要求,求解下面的方程组,分别用Jacobi 迭代法、Gauss-Seidel 迭代法求解
⎪⎪⎩⎪⎪⎨⎧=+++=-++=+-+=+-+9
.369.57.34.05.16
.163.11.89.06.58.18.25.33.63.11.155.04.43.22.74321432143214321x x x x x x x x x x x x x x x x 1.Jacobi 迭代法
#include<stdio.h>
#include<math.h>
main()
{
int i,j,n=4,cj=0;
float a[5][5],x[5],y[5],g[5],b[5][5],x1[5];
float max,sum=0.0;
a[0][0]=7.2;a[0][1]=2.3;a[0][2]=-4.4;a[0][3]=0.5;
a[1][0]=1.3;a[1][1]=6.3;a[1][2]=-3.5;a[1][3]=2.8;
a[2][0]=5.6;a[2][1]=0.9;a[2][2]=8.1;a[2][3]=-1.3;
a[3][0]=1.5;a[3][1]=0.4;a[3][2]=3.7;a[3][3]=5.9;
y[0]=15.1;y[1]=1.8;y[2]=16.6;y[3]=39.6;
x[0]=1;x[1]=1;x[2]=1;x[3]=1;
printf("初始矩阵为\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%f\t",a[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++)
{
g[i]=y[i]/a[i][i];//求出常数项除以x[i]的系数;
for(j=0;j<n;j++)
{
b[i][j]=-a[i][j]/a[i][i];
}
b[i][i]=0;
}
printf("变换后的矩阵为\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%f\t",b[i][j]);
}
printf("\n");
}
do
{ cj++;
for(i=0;i<n;i++)
{
x1[i]=x[i];
}
for(i=0;i<n;i++)
{ sum=g[i];
for(j=0;j<n;j++)
{
sum=sum+b[i][j]*x1[j];// Gauss-Seidel迭代sum=sum+b[i][j]*x[j];就可以了
}
x[i]=sum;
}
max=fabs(x[0]-x1[0]);
for(i=0;i<n;i++)
{
if(fabs(x[i]-x1[i])>max)
{
max=fabs(x[i]-x1[i]);
}
}
}while(max>pow(10,-6));
printf("函数的值为\n");
for(i=0;i<n;i++)
{
printf("x[%d]=%f\n",i,x[i]);
}
printf("循环次数为%d\n",cj);
}
1. Jacobi迭代法的值
2.Gauss-Seidel迭代法
五、总结
通过本次上机实验,我掌握了Jacobi迭代法、Gauss-Seidel迭代法和松弛迭代法求解线性方程组。

编程序实现这3种解线性方程组的方法,就要先熟悉具体的操作步骤,逻辑思路要清晰。

在程序实现过程种,我主要运用了数组存储数据,调用了数组类型的子函数,编写了求逆矩阵的子函数并在主函数中调用,熟练的使用了数组和循环语句。

我编写的程序具有一定的通用性和可读性,可以解决这一类计算。

六、附录
参考:《数值计算方法与算法》(第二版)。

相关文档
最新文档