c编的sor迭代法解线性方程组的程序
线性方程组的数值算法C语言实现(附代码)

线性方程组AX=B 的数值计算方法实验一、 实验描述:随着科学技术的发展,线性代数作为高等数学的一个重要组成部分,在科学实践中得到广泛的应用。
本实验的通过C 语言的算法设计以及编程,来实现高斯消元法、三角分解法和解线性方程组的迭代法(雅可比迭代法和高斯-赛德尔迭代法),对指定方程组进行求解。
二、 实验原理:1、高斯消去法:运用高斯消去法解方程组,通常会用到初等变换,以此来得到与原系数矩阵等价的系数矩阵,达到消元的目的。
初等变换有三种:(a)、(交换变换)对调方程组两行;(b)、用非零常数乘以方程组的某一行;(c)、将方程组的某一行乘以一个非零常数,再加到另一行。
通常利用(c),即用一个方程乘以一个常数,再减去另一个方程来置换另一个方程。
在方程组的增广矩阵中用类似的变换,可以化简系数矩阵,求出其中一个解,然后利用回代法,就可以解出所有的解。
2、选主元:若在解方程组过程中,系数矩阵上的对角元素为零的话,会导致解出的结果不正确。
所以在解方程组过程中要避免此种情况的出现,这就需要选择行的判定条件。
经过行变换,使矩阵对角元素均不为零。
这个过程称为选主元。
选主元分平凡选主元和偏序选主元两种。
平凡选主元:如果()0p pp a ≠,不交换行;如果()0p pp a =,寻找第p 行下满足()0p pp a ≠的第一行,设行数为k ,然后交换第k 行和第p 行。
这样新主元就是非零主元。
偏序选主元:为了减小误差的传播,偏序选主元策略首先检查位于主对角线或主对角线下方第p 列的所有元素,确定行k ,它的元素绝对值最大。
然后如果k p >,则交换第k 行和第p 行。
通常用偏序选主元,可以减小计算误差。
3、三角分解法:由于求解上三角或下三角线性方程组很容易所以在解线性方程组时,可将系数矩阵分解为下三角矩阵和上三角矩阵。
其中下三角矩阵的主对角线为1,上三角矩阵的对角线元素非零。
有如下定理:如果非奇异矩阵A 可表示为下三角矩阵L 和上三角矩阵U 的乘积: A LU = (1) 则A 存在一个三角分解。
sor迭代法手算例题

sor迭代法手算例题SOR迭代法是求解线性方程组的一种经典方式,其基本思想是通过不断迭代来逼近方程组的解。
这种方法在大规模问题上具有很好的效率,因此得到了广泛的应用。
本文将介绍SOR迭代法的基本原理,并以一个手算例题来展示其具体步骤和计算结果。
一、SOR迭代法的基本原理在介绍SOR迭代法的原理之前,我们先来看一下迭代法本身的思想。
假设有一个线性方程组:$$Ax=b$$其中,A是一个$n\times n$的系数矩阵,b是一个$n\times 1$的常数向量,x是一个$n\times 1$的未知向量。
迭代法的基本思想是将方程组表示为:$$x^{(k+1)}=Tx^{(k)}+C$$其中,$x^{(k)}$表示第k次迭代的近似解,$T$是一个$n\times n$的矩阵,$C$是一个$n\times 1$的常数向量。
迭代法的步骤是从一个初始点$x^{(0)}$开始,不断应用上述公式来寻找更好的解$x^{(k+1)}$。
当接近真解时,迭代的过程会不断收敛,即$x^{(k+1)}$会不断逼近真解$x$。
那么,如何确定矩阵$T$和向量$C$呢?最简单的方法是将方程组表示为:$$x^{(k+1)}=(I-\omega A)x^{(k)}+\omega b$$其中,I是$n\times n$的单位矩阵,$\omega$是一个常数,称作松弛因子。
当$\omega=1$时,这就是最基本的迭代法——雅克比迭代法。
但是,雅克比迭代法的收敛速度比较慢,因此需要调整$\omega$的值,从而得到更好的迭代效果。
SOR迭代法就是一种改良的迭代方法,其基本思想是通过加速松弛因子的变化来改善雅克比迭代法的效率。
具体来说,SOR迭代法的公式为:$$x_i^{(k+1)}=(1-\omega)x_i^{(k)}+\frac{\omega}{a_{ii}}\left(b_i-\sum_{j<i}a_{ij}x_j^{(k+1)}-\sum_{j>i}a_{ij}x_j^{(k)}\right)$$其中,$i=1,2,\cdots,n$。
数学实验“线性方程组的j迭代,gs迭代,sor迭代解法”实验报告(内含matlab程序代码)【最新精

西京学院数学软件实验任务书实验四实验报告一、实验名称:线性方程组的J-迭代,GS-迭代,SOR-迭代。
二、实验目的:熟悉线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法,编程实现雅可比方法和高斯-赛德尔方法求解非线性方程组12123123521064182514x x x x x x x x +=⎧⎪++=⎨⎪++=-⎩的根,提高matlab 编程能力。
三、实验要求:已知线性方程矩阵,利用迭代思想编程求解线性方程组的解。
四、实验原理:1、雅可比迭代法(J-迭代法):线性方程组b X A =*,可以转变为:迭代公式(0)(1)()k 0,1,2,....k k J XXB X f +⎧⎪⎨=+=⎪⎩ 其中b M f U L M A M I B J 111),(---=+=-=,称J B 为求解b X A =*的雅可比迭代法的迭代矩阵。
以下给出雅可比迭代的分量计算公式,令),....,()()(2)(1)(k n k k k X X X X =,由雅可比迭代公式有b XU L MXk k ++=+)()1()(,既有i ni j k i iji j k iij k iij b X aXa X a +--=∑∑+=-=+1)(11)()1(,于是,解b X A =*的雅可比迭代法的计算公式为⎪⎩⎪⎨⎧--==∑∑-=+=+)(1),....,(111)()()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k iTn X a X a b a X X X X X 2、 高斯-赛德尔迭代法(GS-迭代法):GS-迭代法可以看作是雅可比迭代法的一种改进,给出了迭代公式:⎪⎩⎪⎨⎧--==∑∑-=+=+++)(1),....,(111)1()1()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k iTn X a X a b a X X X X X 其余部分与雅克比迭代类似。
sor迭代法

SOR迭代法的Matlab程序function [x]=SOR_iterative(A,b)% 用SOR迭代求解线性方程组,矩阵A是方阵x0=zeros(1,length(b)); % 赋初值tol=10^(-2); % 给定误差界N=1000; % 给定最大迭代次数[n,n]=size(A); % 确定矩阵A的阶w=1; % 给定松弛因子k=1;% 迭代过程while k<=Nx(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1);for i=2:nx(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n)')/A(i,i);endif max(abs(x-x0))<=tolfid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n');fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'x的值\n\n');fprintf(fid, '%12.8f \n', x);break;endk=k+1;x0=x;endif k==N+1fid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n');fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'超过最大迭代次数,求解失败!');fclose(fid);end常微分方程的数值解法实验目的:熟悉在Matlab平台上直接求解常微分方程初值问题试验方法1、利用改进欧拉法解方程:程序内容为:fun=@(x,y)x^(-2)-y/x;h=0.05;X=1:h:2;Y(1)=1;for i=2:21Y(i)=Y(i-1)+h/2*(fun(X(i-1),Y(i-1))+fun(X(i),Y(i-1))+h*fun(X(i-1),Y(i-1))); end;Y运行结果为:Y =Columns 1 through 91.0000 0.9989 0.9957 0.9909 0.9848 0.9778 0.9701 0.9618 0.9530Columns 10 through 180.9440 0.9348 0.9254 0.9160 0.9065 0.8971 0.8876 0.8783 0.8690Columns 19 through 210.8598 0.8508 0.8418真实解的求法为:x=1:0.05:2;y=1./x.*(log(x)+1)y =Columns 1 through 81.0000 0.9988 0.9957 0.9911 0.9853 0.9785 0.9710 0.9630Columns 9 through 160.9546 0.9459 0.9370 0.9279 0.9188 0.9096 0.9004 0.8912Columns 17 through 210.8821 0.8731 0.8641 0.8553 0.8466用四阶R-K算法解常微分方程的程序为:fun=@(x,y)x^(-2)-y/x;h=0.1;X=1:h:2;Y(1)=1;for n=2:11k1=fun(x(n-1),Y(n-1));k2=fun(x(n-1)+h/2,Y(n-1)+h/2*k1);k3=fun(x(n-1)+h/2,Y(n-1)+h/2*k2);k4=fun(x(n-1)+h,Y(n-1)+h*k3);Y(n)=Y(n-1)+h/6*(k1+2*k2+2*k3+k4)end;Y运行后了结果为:Y =Columns 1 through 91.0000 0.9957 0.9853 0.9710 0.9546 0.9370 0.9188 0.9004 0.8821Columns 10 through 110.8641 0.8466真实解的求法为:x=1:0.1:2;y=1./x.*(log(x)+1)y =Columns 1 through 91.0000 0.9957 0.9853 0.9710 0.9546 0.9370 0.9188 0.9004 0.8821Columns 10 through 110.8641 0.8466可见其精确度至少已达到0.0012、MATLAB中数值解法“ode45”为:[x1,y1] = ode45(@(x,y)x^(-2)-y/x,[1,2],y0);符号解法“dsolve”求解为:dsolve('Dy=x^(-2)-y/x','y(1) = 1','x')ans =(log(x)+1)/x画出两种算法的图形位:[x1,y1] = ode45(@(x,y)x^(-2)-y/x,[1,2],1);fplot('(log(x)+1)/x',[1,2]);hold on, plot(x1,y1,'ro');数值算法同解析算法几乎完全吻合。
线性方程组数值算法C语言实现(附代码)

0.0000000032
m[16]
0.0000000175
m[41]
0.4999999982
m[17]
0.4999999825
m[42]
0.0000000010
m[18]
0.0000000174
m[43]
0.4999999995
m[19]
0.4999999826
m[44]
0.0000000002
M
方程组的解为
m[0]
0.6339745962
m[25]
0.5000000000
m[1]
0.4641016151
m[26]
0.5000000000
m[2]
0.5096189432
m[27]
0.5000000000
m[3]
0.4974226119
m[28]
0.5000000000
m[4]
0.5006906090
0.5000000000
m[43]
0.5000495837
m[19]
0.5000000000
m[44]
0.4998149517
m[20]
0.5000000000
m[45]
0.5006906091
m[21]
0.5000000000
m[46]
0.4974226119
m[22]
0.5000000000
m[47]
0.5096189432
m[23]
0.5000000000
m[48]
0.4641016151
m[24]
0.5000000000
m[49]
数值分析 迭代法 C++程序

课题三解线性方程组的迭代法实验目标:分别采用Jacobi迭代法,Gauss-Seidel迭代法和SOR迭代法求解线性方程组。
Jocabi迭代法:#include<iostream>#include<math.h>using namespace std;int i,j,k; //计数器int M = 2000;int Array(double ***Arr, int n){double **p;int i;p=(double **)malloc(n*sizeof(double *));if(!p)return 0;for(i=0;i<n;i++){p[i]=(double *)malloc(n*sizeof(double));if(!p[i])return 0;}*Arr=p;return 1;}void main(){double eps ;cout<<"默认最多迭代次数为2000次"<<endl<<"迭代精度为:";cin>>eps;double **matrix;int n;cout<<"矩阵大小为:";cin>>n;double *X;X= new double[n];double *Y;Y= new double[n];double *G;G= new double[n];for(i=0;i<n;i++){Y[i]=0;}if(!Array(&matrix,n))cout<<"内存分配失败!";elsecout<<"请输入矩阵:"<<endl;for( i=0;i<n;i++){for( j=0;j<n;j++){cin>>matrix[i][j];}}cout<<"请输入右端项:"<<endl;double *B;B = new double[n];for(i=0;i<n;i++){cin>>B[i];}for (i = 0 ;i< n;i++){if (fabs(matrix[i][i]) < eps){cout <<"打印失败"<<endl;return;}double T = matrix[i][i];for ( j = 0 ; j< n;j++){matrix[i][j] = -matrix[i][j]/T;}matrix[i][i] = 0;G[i] = B[i]/T;}int counter = 0;while (counter < M){for (i = 0;i < n; i++){double temp = 0;for (j = 0;j<n; j++){temp = temp + matrix[i][j]*Y[j];}X[i] = G[i] + temp;}double temp = 0;for (i = 0 ;i< n ; i++){temp = temp + fabs(X[i] - Y[i]);}if (temp <= eps)break;else{for( i = 0; i < n ;i++){Y[i] = X[i];}}counter++;}cout << "迭代次数为:"<<counter<<"次。
数值分析实验报告--实验6--解线性方程组的迭代法

1 / 8数值分析实验六:解线性方程组的迭代法2016113 张威震1 病态线性方程组的求解1.1 问题描述理论的分析表明,求解病态的线性方程组是困难的。
实际情况是否如此,会出现怎样的现象呢?实验内容:考虑方程组Hx=b 的求解,其中系数矩阵H 为Hilbert 矩阵,,,1(),,,1,2,,1i j n n i j H h h i j n i j ⨯===+-这是一个著名的病态问题。
通过首先给定解(例如取为各个分量均为1)再计算出右端b 的办法给出确定的问题。
实验要求:(1)选择问题的维数为6,分别用Gauss 消去法、列主元Gauss 消去法、J 迭代法、GS 迭代法和SOR 迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何?(2)逐步增大问题的维数(至少到100),仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么?(3)讨论病态问题求解的算法1.2 算法设计首先编写各种求解方法的函数,Gauss 消去法和列主元高斯消去法使用实验5中编写的函数myGauss.m 即可,Jacobi 迭代法函数文件为myJacobi.m ,GS 迭代法函数文件为myGS.m ,SOR 方法的函数文件为mySOR.m 。
1.3 实验结果1.3.1 不同迭代法球求解方程组的结果比较选择H 为6*6方阵,方程组的精确解为x* = (1, 1, 1, 1, 1, 1)T ,然后用矩阵乘法计算得到b ,再使用Gauss 顺序消去法、Gauss 列主元消去法、Jacobi 迭代法、G-S 迭代法和SOR 方法分别计算得到数值解x1、x2、x3、x4,并计算出各数值解与精确解之间的无穷范数。
Matlab 脚本文件为Experiment6_1.m 。
迭代法的初始解x 0 = (0, 0, 0, 0, 0, 0)T ,收敛准则为||x(k+1)-x(k)||∞<eps=1e-6,SOR方法的松弛因子选择为w=1.3,计算结果如表1。
C语言实现牛顿迭代法解方程详解

C语⾔实现⽜顿迭代法解⽅程详解C语⾔实现⽜顿迭代法解⽅程详解利⽤迭代算法解决问题,需要做好以下三个⽅⾯的⼯作:⼀、确定迭代变量在可以⽤迭代算法解决的问题中,我们可以确定⾄少存在⼀个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
⼆、建⽴迭代关系式所谓迭代关系式,指如何从变量的前⼀个值推出其下⼀个值的公式(或关系)。
迭代关系式的建⽴是解决迭代问题的关键,通常可以使⽤递推或倒推的⽅法来完成。
三、对迭代过程进⾏控制在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。
不能让迭代过程⽆休⽌地执⾏下去。
迭代过程的控制通常可分为两种情况:⼀种是所需的迭代次数是个确定的值,可以计算出来;另⼀种是所需的迭代次数⽆法确定。
对于前⼀种情况,可以构建⼀个固定次数的循环来实现对迭代过程的控制;对于后⼀种情况,需要进⼀步分析得出可⽤来结束迭代过程的条件。
接下来,我介绍⼀种迭代算法的典型案例----⽜顿-拉夫逊(拉弗森)⽅法⽜顿-拉夫逊(拉弗森)⽅法,⼜称⽜顿迭代法,也称⽜顿切线法:先任意设定⼀个与真实的根接近的值x0作为第⼀次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第⼆次近似根,再由x1求出f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,……如此继续下去,直到⾜够接近(⽐如|x- x0|<1e-6时)真正的根x*为⽌。
⽽f '(x0)=f(x0)/( x1- x0)所以 x1= x0- f(x0)/ f ' (x0)。
我们来看⼀副从⽹上找到的图:接下来,我们来看⼀个例⼦:我们还是直接上代码:例⼦:⽤⽜顿迭代法求下列⽅程在值等于2.0附近的根:2x3-4x2+3x-6=0。
#include <stdio.h>#include <math.h>int main(void){float x,x0,f,f1;x = 2.0;do{x0=x;f=2*x0*x0*x0-4*x0*x0+3*x0-6;f1=6*x0*x0-8*x0+3;x=x0-f/f1;//函数fabs:求浮点数x的绝对值//说明:计算|x|, 当x不为负时返回 x,否则返回 -x}while(fabs(x-x0)>=1e-5);printf ("%f\n",x);return 0 ;}执⾏结果:当x=1.5时,⽅程2x3-4x2+3x-6=0。
线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法

西京学院数学软件实验任务书【实验课题】雅克比迭代、高斯—赛德尔迭代、超松弛迭代 【实验目的】学习和掌握线性代数方程组的雅克比迭代、高斯—赛德尔迭代、超松弛迭代法,并且能够熟练运用这些迭代法对线性方程组进行求解。
【实验内容】 1、问题重述:对于线性方程组A b X =,即:1111221n 12112222n 21122nn n n n n n n a x a x a x b a x a x a x b a x a x a x b +++=⎧⎪+++=⎪⎨⎪⎪+++=⎩ (1),其中,111212122111 0 - - 0 - 0 0 () - - - 0 n ij n nn n nn nn a a a a a a a a a a ⨯--⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥A ==--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦ 0n D L U ⎡⎤⎢⎥⎢⎥≡--⎢⎥⎢⎥⎣⎦()1,n b b b T=如何运用雅克比迭代、高斯—赛德尔迭代、超松弛迭代法对线性方程组进行求解。
2、方法原理: 2.1雅克比迭代迭代思想:首先通过A b X =构造形如()x f x =的等式,然后给定一个初值(0)(0)(0)(0)12(,,)n x x x X =,再通过(1)()()k k f +X =X 进行迭代。
step1 :对(1)相应第i 行中的i x 用其它元素表示为:11111121111122,12211111()()11()()11()()n nj j j j j j n ni i ij ji j j j i j i j iin nn n nj j n n nj j j j nn nn x b a x x b a x a a x b a x x b a x a a x b a x x b a x a a ===≠=-==⎧=-=+-⎪⎪⎪⎪⎨=-=+-⎪⎪⎪=-=+-⎪⎩∑∑∑∑∑∑即:()D b L U X =-+XStep 2 :进行迭代(0)(0)(0)(0)12(1)11()(,,)()n k k x x x D b D L U +--⎧X =⎨X=-+X ⎩,0,1,2k =,取它的判断条件为()(1)k k -X -X 小于一个确定的误差值ε,跳出循环。
实验3 Jacobi,Gauss-seidel 和SOR迭代法

《计算方法》实验3一.实验名称:Jacobi迭代, Gauss-Seidel迭代和SOR法二.实验目的:熟悉解线性方程组的一些常见迭代法,如Jacobi, Gauss-Seidel迭代,SOR法等。
三.实验内容1.Jacobi迭代法,保留四位有效数字(err=1e-4) 例1 用jacobi迭代法求解代数线性代数方程组AX b其中A=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3]。
解:编写jacobi迭代法的函数文件,保存为jacobi.mfunction [x,k]=jacobi(A,b,x0,eps,N)% 求解Ax=b;x0为初始列向量;eps为误差容限;N为最大迭代次数% 输出x为近似解;k为迭代次数n=length(A);x=zeros(n,1);for k=1:Nfor i=1:n―――――――endif norm(x-x0,inf)<eps % 迭代终止条件% if (max(abs(x-x0)))<epsbreak;endx0=x;end编写主程序如下format longclearA=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3];x0=[0.125; 0.4 ;-0.6 ]; % x0为初始列向量N为最大迭代次数err=1e-4; % err为误差容限N=25; % N为最大迭代次数[x,k]=jacobi(A,b,x0,err,N)得到结果如下x =0.224923156250000.30561995000000-0.49388680000000k =62.Gauss-seidel迭代法=,保留四位有效数字(err=1e-4) 例2 用Gauss-seidel迭代法求解代数线性代数方程组AX b其中A=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3]。
解:编写Gauss-seidel迭代法的函数文件,保存为gaus.mfunction [x,k]=gaus(A,b,x0,eps,N)% 求解Ax=b;x0为初始列向量;eps为误差容限;N为最大迭代次数% 输出x为近似解;k为迭代次数n=length(A);x=zeros(n,1);for k=1:Nfor i=1:n――――――endif norm(x-x0,inf)<eps % 迭代终止条件% if (max(abs(x-x0)))<epsbreak;endx0=x;end编写主程序如下format longclearA=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3];x0=[0.125; 0.4 ;-0.6 ]; % x0为初始列向量N为最大迭代次数err=1e-4; % err为误差容限N=25; % N为最大迭代次数[x,k]=gaus(A,b,x0,err,N)输出结果为x =0.224939378906250.30562326171875-0.49388747187500k =53.SOR迭代法=,松驰因子w=1.005,例3 用SOR迭代法求解代数线性代数方程组AX b其中A=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3]。
LAB07_解线性方程组的基本迭代法实验

Lab07.解线性方程组的基本迭代法实验【实验目的和要求】1.使学生深入理解Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法;2.通过对Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法的程序设计,以提高学生程序设计的能力;3.应用编写的程序解决具体问题,掌握三种基本迭代法的使用,通过结果的分析了解每一种迭代法的特点。
【实验内容】1.根据Matlab 语言特点,描述Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法。
2.编写Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法的M 文件。
3.给定2020⨯∈R A 为五对角矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------321412132141412132141412132141412132141213 (1)选取不同的初始向量)0(x 及右端面项向量b ,给定迭代误差要求,分别用编写的Jacobi 迭代法和Gauss-Seidel 迭代法程序求解,观察得到的序列是否收敛?若收敛,通过迭代次数分析计算结果并得出你的结论。
(2)用编写的SOR 迭代法程序,对于(1)所选取的初始向量)0(x 及右端面项向量b 进行求解,松驰系数ω取1<ω<2的不同值,在5)1()(10-+≤-k k x x 时停止迭代,通过迭代次数分析计算结果并得出你的结论。
【实验仪器与软件】1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ;2.Matlab 6.0及以上版本。
实验讲评:实验成绩:评阅教师: 200 年 月 日Lab07.解线性方程组的基本迭代法实验一、算法描述1、雅可比迭代法描述如下:将线性方程组b Ax =中的系数矩阵n n ij R a A ⨯∈=)(分为三部分UL D a a a a a a a a aa a a a a a A n n n n n n n n n n n n nn --=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-------⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-------⎪⎪⎪⎪⎪⎭⎫⎝⎛=------00000000,121,211,1121,212,11,1212211设),,2,1(0n i a ii =≠选取M 为A 的对角元素部分,即选取M=D (对角矩阵),A=D-N,由⎪⎩⎪⎨⎧=+=+,,1,0,)(1)(k (0)k f Bx xx k初始向量得到解Ax=b 的雅可比迭代法 ⎪⎩⎪⎨⎧=+=+,,1,0,)(1)(k (0)k f Bx xx k初始向量其中b D f J U L D A D I B 111,)(---=≡+=-=,称J 为解Ax=b 的雅可比迭代法的迭代矩阵。
SOR迭代matlab程序

Numerical Analysis
逐次超松弛迭代(SOR迭代)
设已求得 n 元线性代数方程组 Ax = b第k -1次迭
代向量 x(k1) x1(k1) , x2(k1) ,L , xn(k1) T及第k 次迭代向量
x(k的) 分量 x(jk) ( j 1, 2,L ,i 1) ,要计算分量 xi.(k )
xi
GSeaiudsesl迭代值
x(k 1) i
i 1
aijቤተ መጻሕፍቲ ባይዱ
x(k ) j
n
aij
x(k 1) j
bi
aii
j1
j i
(i 1, 2,L , n) (5.10)
SOR迭代法的矩阵表示 (A D L U )
x(k ) (1 ) x(k 1) D1(b Lx(k ) Ux(k 1) )
Step 1 用Gauss-Seidel 迭代求得
xi
1 aii
i 1 j 1
aij x(jk )
n
a x(k 1) ij j
j i 1
bi
Step 2 计算 x与i 第k -1次迭代值 xi(的k1)加权平均作为
第k 次迭代值:
x(k ) i
(1 ) xi(k 1)
xi
贵州师范大学数学与计算机科学学院
Numerical Analysis
x(k ) i
(1 ) xi(k 1)
xi
(1 )xi(k1)
1 aii
i 1 j 1
aij x(jk )
n
a x(k 1) ij j
j i 1
bi
x(k 1) i
i 1
aij x(jk )
数值计算_第4章 解线性方程组的迭代法

如果用高斯-赛德尔迭代法 迭代72次得:
用SOR迭代法 ,只须迭代25次即得:
逐次超松弛迭代算法
下列算法假定迭代矩阵收敛,否则要在WHILE循环中增加判断条件。
1.定义和输入系数矩阵 与常数项向量 的元素,输入松弛因子 的值。
2.FOR i:=1,2,…,n
//假定 ,形成常数项向量
FOR
当方程组的系数矩阵 具有某些性质时,可直接判定由它生成的雅可比迭代矩阵是收敛的。
定理4.3若方程组 的系数矩阵 ,满足下列条件之一,则其雅可比迭代法是收敛的。
(1) 为行对角占优阵,即
(2) 为列对角占优阵,即
证明:(1)雅可比迭代矩阵 其中
(2) 为列对角优阵,故 为行对角占优阵,由系数矩阵 构造的迭代矩阵 为行对角占优阵,则有
通常,把 的迭代称为亚松弛迭代,把 的迭代称为高斯-塞德尔迭代,而把 的迭代称为松弛迭代。
4.4
在线性代数中逆矩阵是按其伴随矩阵定义的,若 则方阵 可逆,且 ,其中 为 的伴随矩阵。要计算 个 阶的列式才能得到一个伴随矩阵,在数值计算中因其计算工作量大而不被采用。通常对 做行的初等的效换,在将 化成 的过程中得到 。在数值计算中,这仍然是一种行之有效的方法。
事实上,在计算 前,已经得到 的值,不妨将已算出的分量直接代入迭代式中,及时使用最新计算出的分量值。因此 的计算公式可改为:
即用向量 计算出 的值,用向量 计算出 的值 ,用向量 计算出 的值,这种迭代格式称为高斯—塞德尔迭代。
对于方程组AX=y,如果由它构造高斯-塞德尔迭代和雅可比迭代都收敛,那么,多数情况下高斯—塞德尔迭代比雅可比迭代的收敛效果要好,但是情况并非总是如此。
又
得到
而 ,
用SOR迭代法

一、数值求解如下正方形域上的Poisson 方程边值问二、2222(,)2,0,1(0,)(1,)(1),01(,0)(,1)0,01u u f x y x y x y u y u y y y y u x u x x ⎧⎛⎫∂∂-+==<<⎪ ⎪∂∂⎪⎝⎭⎨==-≤≤⎪⎪==≤≤⎩二、用椭圆型第一边值问题的五点差分格式得到线性方程组为2,1,1,,1,10,1,,0,141,?,?,?,?0,1i j i j i j i j i j ijj N j i i N u u u u u h f i j N u u u u i j N -+-+++----=≤≤====≤≤+,写成矩阵形式Au=f 。
其中 三、基本原理程序步骤:所有的步骤基本一致 1. 设置u ,n ,并给u ,n 赋初值; 2. While 语句循环,到的6步 3. Up 我第K 次迭代的值; 4. 分别进行计算,sum=0; 例如:Jacobi :sun= sum+A(i,j)*Ub; SOR 和Gauss_Seidel= sum+A(i,j)*u; 各自进行相应的下不运算。
5. 计算|Up-u|<ep 的绝对值,判断是否停机 6. 如果小于规定误差,迭代终止; 7. 输出结果u 和迭代次数k8. 在块的迭代中调用了追赶法的求解子程序zg ,在SOR 设计了A 得自动生成子程序creat_matix.1122N N v b v b u f v b ⎛⎫⎛⎫ ⎪ ⎪ ⎪⎪== ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭4114114ii A -⎛⎫ ⎪- ⎪= ⎪- ⎪-⎝⎭11,12,1,121,22,2,21,2,,2211,12,1,121,22,2,221,2,,(,,...,),(,,...,),......,(,,...,)(,,...,)?,(,,...,)?,......,(,,...,)?1,999,0.10.011T T N N TN N N N N T T N N T N N N N N v u u u v u u u v u u u b h f f f b h f f f b h f f f h N h N ====+=+=+===+取或则或,2,,1,2,...,i j f i j N==1122NN A I I A A I IA -⎛⎫ ⎪-⎪= ⎪- ⎪-⎝⎭四、编写求解线性方程组Au=f的算法程序,用下列方法编程计算,并比较计算速度。
松弛迭代法解线性方程组C程序

printf("经过 %d 次迭代,得到了满足迭代精度的解如下:\n",k);
for(i=1;i<=n;i++)
{
printf("%lf\n",xnew[i]);
}
printf("欢迎您下次使用\n");
}
//********************************************************//
double *xnew=new double [n+1];//开辟存储x(k+1)的空间
for(i=1;i<=n;i++)//定义初始的迭代向量x0=[1,1,.....1]'
{
x[i]=1;
}
//******************迭代法计算方程组的解*******************//
}
if(j==i)
{
sum=sum+(1-w)*x[j];
}
if(j>i)
{
sum=sum-w*(A[i][j]/A[i][i])*x[j];
}
}
sum=sum+w*b[i]/A[i][i];
#include <math.h>
void SOR(int n,double w, double **A, double *b);//本子函数用SOR方法解线性方程组Ax=b;
//入口参数为n;以及矩阵A,b
printf("每行内元素与元素之间用空格隔开,每输完一行后按Enter键,再继续输入下一行。\n");
迭代法求方程组的实现

方程组迭代法实现在数值分析课程中,有许多诸如迭代之类的计算方法,可以非常有效通过求迭代近似解决许多无法求,或很难求精确解的问题。
但这类方法往往有着非常巨大的计算量,并不适合通过人力自行解决,所以我便打算自己编写一个程序,可以实现三种求方程组解的迭代法。
另外,由于SOR 法会有寻找最佳的w 值的需求,所以也一并实现了寻找SOR 法的最佳w 。
在编写程序之前,应对三种方法的迭代过程充分了解。
雅可比迭代法:()()()112213311112212233222212211()1n n n n n n n n nn n n nn x a x a x a x b a x a x a x a x b a II x a x a x a x b a ⎧=----+⎪⎪⎪=----+⎪⎨⎪⎪⎪=---+⎪⎩高斯-赛德尔法:()()()(1)()()()11221331111(1)(1)()()22112332222(1)(1)(1)(1)()()1122,11,11(1)(1)1221111k k k k n n k k k k n n k k k k k k i i i i i i i i i in n i ii k k n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x a x a x b a x a x a x a +++++++--++++=----+=----+=-------+=--()(1)(1)()k k nn n n IV a x b ++⎧⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪--+⎪⎩SOR 法:(1)()k k w X L X f+=+根据以上的迭代法的思想,设计了程序,运行界面如下:该程序在使用过程中对用户进行引导,用户可自行选择方法,并输入方程组,程序为用户提供解答,并给出迭代次数。
如图所示,其中高斯赛德尔法输入了课本第六章的例题中1.2式,而SOR法则是课本第六章习题的第八题,并且还发现课本第八题的答案有误,经我人工检验后,上述程序中的解才是正确答案。
c++解线性方程组的迭代法

if(c[i]<0)
c[i]=-c[i];
x0[i]=x[i];
sum=0;
}
r=max(c);
if(r<s)
{for(i=0;i<10;i++)
cout<<"x"<<i<<" = "<<x[i]<<setprecision(10)<<endl;
cout<<"迭代次数:"<<k<<endl;
return 0;
}
}
}
double max(double array[10])
{
double a=array[0];
int i;
for(i=1;i<10;i++)
{
if(a<array[i])
a=array[i];
}
return a;
}
SOR方法
#include<iostream>
#include<math.h>
int i,k,j;
double r,sum=0;
cout<<"输入精度:"<<endl;
cin>>s;
for(k=1;;k++)
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
sum=a[i][j]*x0[j]+sum;