计算方法-线性方程组的直接法实验
实验报告一

实验一姓名:专业:班级:实验题目:解线性方程组的直接法日期:一、实验目的及意义1)掌握Gausum消去法及Gausum列主元消去法,能用这两种方法求解方程组。
2)掌握追赶法;3)掌握高斯消去法进行到底的条件;4)了解选主元素高斯消去法的优点。
二、实验重点及难点1)列主元素消去法2)矩阵的LU分解三、实验条件1)每人一台计算机2)应用软件:Matlab四、实验要求1)验证Gausum列主元消去法2)设计LU分解法程序3)设计追赶法程序五、实验内容1)补充程序,使程序完整,用列主元素消去法解方程组⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎭⎫⎝⎛⎪⎪⎪⎭⎫⎝⎛2/52/11931423222321xxx。
function x=Gaussumxiaoqufa(A,b)% 用Gauss列主元消去法解线性方程组Ax=b n=length(b);x=zeros(n,1);c=zeros(1,n);% 寻找最大主元t=0;for i=1:n-1max=abs(A(i,i));m=i;for j=i+1:nif max<abs(A(j,i)) max=abs(A(j,i)); m=j; end end if m~=ifor k=1:nc(k)=A(i,k); A(i,k)=A(m,k); A(m,k)=c(k); end t=b(i); b(i)=b(m); b(m)=t; endfor k=i+1:n for j=i+1:nA(k,j)=A(k,j)-A(i,j)*A(k,i)/A(i,i); endb(k)=b(k)-b(i)*A(k,i)/A(i,i); A(k,i)=0; end end % 回代求解x(n)=b(n)/A(n,n); for i=n-1:-1:1 sum=0; for j=i+1:nsum=sum+A(i,j)*x(j); endx(i)=(b(i)-sum)/A(i,i); end2)补充程序,使程序完整,用LU 分解法解方程组⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛2/52/11931423222321x x x 。
解线性方程组的直接方法

解线性方程组的直接方法一、高斯消元法高斯消元法是解线性方程组最常用的方法之一、它通过一系列的消元操作,将线性方程组转化为阶梯型方程组,从而求解未知数的值。
1.确定线性方程组的阶数和未知数的个数。
设线性方程组中有n个未知数。
2.将线性方程组写成增广矩阵的形式。
增广矩阵是一个n行n+1列的矩阵,其中前n列是线性方程组的系数矩阵,第n+1列是等号右边的常数。
3.通过初等行变换(交换行、数乘行、行加行)将增广矩阵化为阶梯型矩阵。
具体步骤如下:a.首先,找到第一个非零元素所在的列,将它所在的行视为第一行。
b.将第一行的第一个非零元素(主元)变成1,称为主元素。
c.将主元所在列的其他元素(次元素)变为0,使得主元所在列的其他元素只有主元素是非零的。
d.再找到第一个非零元素所在的列,将它所在的行视为第二行,并重复上述步骤,直到将增广矩阵化为阶梯型矩阵。
4.根据阶梯型矩阵求解未知数的值。
具体步骤如下:a.从最后一行开始,依次求解每个未知数。
首先,将最后一行中非零元素所在的列作为含有该未知数的方程,将该未知数的系数设为1b.将含有该未知数的方程中其他未知数的系数设为0,并对其他方程进行相应的变换,使得该未知数所在列的其他元素都为0。
c.重复上述步骤,直到求解出所有未知数的值。
高斯消元法的优点是简单易懂、容易实现,但当线性方程组的系数矩阵接近奇异矩阵时,计算精度可能会降低。
二、矩阵求逆法矩阵求逆法是解线性方程组的另一种直接方法。
它通过对系数矩阵求逆,然后与常数矩阵相乘,得到未知数的值。
1.确定线性方程组的阶数和未知数的个数。
设线性方程组中有n个未知数。
2.将线性方程组写成矩阵方程的形式,即Ax=b,其中A是一个n阶方阵,x和b分别是n维列向量。
3.求系数矩阵A的逆矩阵A^-1a. 首先,计算系数矩阵A的行列式det(A)。
b. 判断det(A)是否为0,如果det(A)=0,则该线性方程组无解或有无穷多解;如果det(A)≠0,则系数矩阵A可逆。
计算方法2线性方程组直接法

04
矩阵的三角分解法
LU分解法
定义:将系数矩阵A分解为一个下三角 矩阵L和一个上三角矩阵U的乘积,即 A=LU。
适用范围:适用于所有可逆矩阵,特别 适用于中小型稠密矩阵。
迭代法收敛性判断
在迭代法求解方程组时,可以通过观察迭代过程中解向量的范数的变化情况来判断迭代法 是否收敛。如果解向量的范数逐渐减小并趋于零,则表明迭代法收敛。
方程组性态分析
方程组的性态是指方程组解的存在性、唯一性和稳定性等方面的性质。通过分析方程组的 系数矩阵的范数,可以对方程组的性态进行初步的判断。例如,如果系数矩阵的谱半径( 即最大特征值的模)较小,则方程组往往具有较好的性态。
03
线性方程组在科学研究、工程技术和经济管理等领域具有广 泛的应用。
直接法的定义与分类
1
直接法是一种通过有限步四则运算求解线性方程 组的方法,具有计算精度高、稳定性好的特点。
2
直接法可分为高斯消元法、列主元消元法、全主 元消元法等多种方法,其中高斯消元法是最基本 的方法。
3
各种直接法的主要区别在于选主元和消元的过程 中采用不同的策略,以达到提高计算精度和稳定 性的目的。
对系数矩阵A进行Crout分解,得到下三角矩阵L和单位 上三角矩阵U。
利用后向代入法求解Ux=y,得到向量x。
求解步骤
利用前向代入法求解Ly=b,得到向量y。
适用范围:适用于所有可逆矩阵,特别适用于中小型稠 密矩阵。与LU分解法和Doolittle分解法相比,Crout 分解法在某些情况下具有更高的计算效率。
性质
求解线性方程组的直接解法

求解线性方程组的直接解法5.2LU分解① Gauss消去法实现了LU分解顺序消元结束时的上三角矩阵U和所用的乘数,严格下三角矩阵。
将下三角矩阵的对角元改成1,记为L,则有A=LU,这事实是一般的,我们不难从消去的第k个元素时的矩阵k行及k列元素的历史得到这一点.因为从消元的历史有u kj=a kj-m k1u1j- m k2u2j -…- m k,k-1u k-1,j, j=k,k+1,…,nm ik=(a ik-m i1u1k- m i2u2k -…-m i,k-1u k-1,k>/u kk i=k+1,k+2,…,n于是a kj=m k1u1j+m k2u2j+…+m k,k-1u k-1,j+u kj, j=k,k+1,…,na ik=m i1u1k+m i2u2k+…+m i,k-1u k-1,k+m ik u kk i=k+1,k+2,…,n从前面两个式子我们可以直接计算L和U(见下段>.将矩阵分解为单位下三角矩阵和上三角矩阵之积称为矩阵的LU分解.顺序消元实现了LU分解,同时还求出了g, Lg=b的解.②直接LU分解上段我们得到(l ij=m ij>u kj=a kj-l k1u1j-l k2u2j -…- l k,k-1u k-1,j, j=k,k+1,…,nl ik=(a ik-l i1u1k-l i2u2k -…-l i,k-1u k-1,k>/u kk i=k+1,k+2,…,n2诸元素对应乘积,只不过算L的元素时还要除以同列对角元.这一规律很容易记住.可写成算法(L和U可存放于A>:for k=1:n-1for j=k:nu kj=a kj-l k1u1j-l k2u2j -…- l k,k-1u k-1,jendfor i=k+1:nl ik=(a ik-l i1u1k-l i2u2k -…-l i,k-1u k-1,k>/u kkendend这一算法也叫Gauss消去法的紧凑格式,可一次算得L,U的元素,不需逐步计算存储.考察上面的表格会发现还可安排其它计算次序,只要在这一次序下每个元素左边的L的元素与上方的U的元素已计算在先。
数值分析线性方程组直接法实验

实验报告
一、实验目的
1.了解LU 分解法的优点
二、实验题目
1.给定矩阵A 和向量b:
.1000,123121⎪⎪⎪⎪⎪
⎪⎭
⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--= b n n n n n n A (1)求A 的LU 分解,n 的值自己确定;
(2)利用A 的LU 分解求解下列方程组
(a)b Ax =, (b)b x A =2, (c)b x A =3.
对方程组(c),若先求3A LU =,再解b x LU =)(有何缺点?
三、实验原理
求解线性方程组的LU 分解法直接解线性方程组.
四、实验内容及结果
2. b Ax =,b x A =2,b x A =3的求解。
3. 若先求3
A LU =,再解b x LU =)(.
五、实验结果分析
LU 分解法的优点:根据题目,如果直接用b x A =3来计算的话,需要先计算3A 的值,然后再计算方程组的值,步骤会多出很多,使得计算更复杂。
如果使用LU 分解法来解方程组的话,只需要对系数矩阵做一次LU 分解,以后只要解三角方程即可,计算的步骤明显减少。
解线性方程组的直接方法实验报告

解线性方程组的直接方法实验报告解线性方程组的直接方法实验报告1.实验目的:1、通过该课题的实验,体会模块化结构程序设计方法的优点;2、运用所学的计算方法,解决各类线性方程组的直接算法;3、提高分析和解决问题的能力,做到学以致用;4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。
2.实验过程:实验代码:#include "stdio.h"#include "math.h"#includeusing namespace std;//Gauss法void lzy(double **a,double *b,int n){int i,j,k;double l,x[10],temp;for(k=0;k<n-1;k++){for(j=k,i=k;j<n;j++){if(j==k)temp=fabs(a[j][k]);else if(temp<fabs(a[j][k])) {temp=fabs(a[j][k]);i=j;}}if(temp==0){cout<<"无解" ; return;}else{for(j=k;j<n;j++){temp=a[k][j];a[k][j]=a[i][j];a[i][j]=temp;}temp=b[k];b[k]=b[i];b[i]=temp;}for(i=k+1;i<n;i++){l=a[i][k]/a[k][k];for(j=k;j<n;j++)a[i][j]=a[i][j]-l*a[k][j];b[i]=b[i]-l*b[k];}}if(a[n-1][n-1]==0){cout<<"无解" ; return;}x[n-1]=b[n-1]/a[n-1][n-1]; for(i=n-2;i>=0;i--){temp=0;for(j=i+1;j<n;j++)temp=temp+a[i][j]*x[j];x[i]=(b[i]-temp)/a[i][i];}for(i=0;i<n;i++){printf("x%d=%lf ",i+1,x[i]);printf(" ");}}//平方根法void pfg(double **a,double *b,int n) {int i,k,m;double x[8],y[8],temp;for(k=0;k<n;k++){temp=0;for(m=0;m<k;m++)temp=temp+pow(a[k][m],2);if(a[k][k]<temp)return;a[k][k]=pow((a[k][k]-temp),1.0/2.0);for(i=k+1;i<n;i++){temp=0;for(m=0;m<k;m++)temp=temp+a[i][m]*a[k][m]; a[i][k]=(a[i][k]-temp)/a[k][k]; }temp=0;for(m=0;m<k;m++)temp=temp+a[k][m]*y[m];y[k]=(b[k]-temp)/a[k][k];}x[n-1]=y[n-1]/a[n-1][n-1];for(k=n-2;k>=0;k--){temp=0;for(m=k+1;m<n;m++)temp=temp+a[m][k]*x[m];x[k]=(y[k]-temp)/a[k][k];}for(i=0;i<n;i++){printf("x%d=%lf ",i+1,x[i]);printf(" ");}}//追赶法void zgf(double **a,double *b,int n){int i;double a0[10],c[10],d[10],a1[10],b1[10],x[10],y[10]; for(i=0;i<n;i++) {a0[i]=a[i][i];if(i<n-1)c[i]=a[i][i+1];if(i>0)d[i-1]=a[i][i-1];}a1[0]=a0[0];for(i=0;i<n-1;i++){b1[i]=c[i]/a1[i];a1[i+1]=a0[i+1]-d[i+1]*b1[i];}y[0]=b[0]/a1[0];for(i=1;i<n;i++)y[i]=(b[i]-d[i]*y[i-1])/a1[i];x[n-1]=y[n-1];for(i=n-2;i>=0;i--)x[i]=y[i]-b1[i]*x[i+1];for(i=0;i<n;i++){printf("x%d=%lf ",i+1,x[i]);printf(" ");}}int main{int n,i,j;double **A,**B,**C,*B1,*B2,*B3;A=(double **)malloc(n*sizeof(double)); B=(double **)malloc(n*sizeof(double));C=(double **)malloc(n*sizeof(double));B1=(double *)malloc(n*sizeof(double));B2=(double *)malloc(n*sizeof(double));B3=(double *)malloc(n*sizeof(double));for(i=0;i<n;i++){A[i]=(double *)malloc((n)*sizeof(double)); B[i]=(double *)malloc((n)*sizeof(double)); C[i]=(double *)malloc((n)*sizeof(double)); } cout<<"第一题(Gauss列主元消去法):"<<endl<<endl; cout<<"请输入阶数n:"<<endl;cin>>n;cout<<" 请输入系数矩阵: ";for(i=0;i<n;i++)for(j=0;j<n;j++){。
计算方法-解线性方程组的直接法实验报告

cout<<endl;
for(k=i+1;k<m;k++)
{
l[k][i]=a[k][i]/a[i][i];
for(r=i;r<m+1;r++) /*化成三角阵*/
a[k][r]=a[k][r]-l[k][i]*a[i][r];
}
}
x[m-1]=a[m-1][m]/a[m-1][m-1];
{
int i,j;
float t,s1,s2;
float y[100];
for(i=1;i<=n;i++) /*第一次回代过程开始*/
{
s1=0;
for(j=1;j<i;j++)
{
t=-l[i][j];
s1=s1+t*y[j];
}
y[i]=(b[i]+s1)/l[i][i];
}
for(i=n;i>=1;i--) /*第二次回代过程开始*/
s2=s2+l[i][k]*u[k][r];
l[i][r]=(a[i][r]-s2)/u[r][r];
}
}
printf("array L:\n");/*输出矩阵L*/ for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%7.3f ",l[i][j]);
printf("\n");
{
s2=0;
for(j=n;j>i;j--)
计算方法实验报告2

实验报告2:解线性方程组的直接法姓名:杜娟学号:08012324 班级:勘查08-3班一.上机题目用高斯列主元消去法和LU分解法解线性方程组二.目的要求掌握用高斯列主元消去法和LU分解法设计程序,从而实现解线性方程组。
三.方法原理1.如果在一列中选取按模最大的元素,将其调到主干方程位置再做消元,则称为列主元消元法。
调换方程组的次序是为了使运算中做分母量的绝对值尽量地大,减少舍入误差的影响。
2.由高斯消元法得到启发,对消元的过程相当于将分解为一个上三角矩阵和一个下三角矩阵的过程。
如果直接分解得到和,。
这时方程化为,令,由解出;再由,解出。
这就是直接分解法。
四.算法步骤列主元消元法算法1.输入:方程组阶数n,方程组系数矩阵A和常数向量项b。
2.for k=1 to n-1 //选主元的消元过程{//选择{s=|a kk|,m=kfor u=k+1 to nif |a uk|>s then{m=u,s=| a uk|}for v=k to n //交换第k行和第m行{t=a kv; a kv=a mv; a mv=t}t=b k;b k=b m;b m=t}for i=k+1 to n{t=a ik/a kkfor j=k+1 to n{a ij=a ij-t*a kj}b i=b i-t*a kj}}3.for i:=n TO 1 //回代求解4.输出方程组的解 x i, i=1,2,…,n。
如果对于第k步,从k行至n行和从k列至n列中选取按模最大的,对第行和第行交换,对第列和第v列交换,这就是全主元消元法。
在k列和第v列交换时,还要记录下v的序号,以便恢复未知量xk和xv的位置。
LU分解法1计算的第一行元素要计算,则列出式(3.20)等号两边的第1行第1列元素的关系式:故。
一般地,由的第一行元素的关系式得到2计算的第一列元素要计算,则列出式(3.20)等号两边的第2行第1列元素的关系式:故。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六 线性方程组的直接法实验
一. 实验目的
(1)深入理解线性方程组的直接法的设计思想,掌握不同方法的矩阵分解手续,以
及解决某些实际的线性方程组求解问题。
(2)熟悉Matlab 编程环境,利用Matlab 解决具体的方程求根问题。
二. 实验要求
用Matlab 软件实现线性方程组求解的高斯选主元素法、追赶法、矩阵分解法和Cholesky 法,并用实例在计算机上计算。
三. 实验内容
1. 实验题目
(1)利用高斯选主元素法求解下列方程组:
⎥⎥⎥⎥⎦
⎤
⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢
⎢⎢
⎢⎣⎡-------10165300
0231023100124321x x x x 编写文件Gauss_pivot.m 文件如下所示:
运行时的代码如下所示:
验算过程如下:
可见运行正确;
(2)用矩阵分解法求解方程组:
⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡111156757810791086109754321x x x x 编写文件lu_decompose(A,b),代码如下所示:
运行如下所示:
验算如下结果与b相差甚少
(3)用Cholesky 方法求解方程组:
⎪⎩⎪
⎨⎧-=++=++-=+-7
910431017210424321
321321x x x x x x x x x 编写文件Chol_decompose.m 文件,代码如下所示:
运行过程如下所示:
验算如下所示:
可见结果是正确的;
(4)用追赶法求解方程组:
⎪⎪⎩⎪⎪
⎨
⎧-=+=++-=-+-=+3244.717.177260.46
067.28260.4601.132590.67
709.49 590.67810.98860.90254.33
860.9001.1364343232121x x x x x x x x x x 编写文件threedia.m ,代码如下所示:
运行结果如下所示:
验证如下:
可见误差是微小的;
2. 设计思想
要求针对上述题目,详细分析每种算法的设计思想。
(1)利用高斯选主元素法
对于所要消去的第i个元素,首先比较同列的还有待消去的其它行中元素的值,选择其中最大的换到改行,再继续消元,而后回代;消元和回代的思想为,通过将一个方程乘以或除以某个常数,以及将两个方程相加减这两种手续,逐步消去方程中的变元,而将所给方程加工成便于求解的三角方程组乃至对角方程组的形式;
(2)矩阵分解法
将系数矩阵分解为下三角阵和上三角阵的乘积则
L(Ux)=b
可化归为两个三角方程组
Ly=b,Ux=y
这两个方程组都是容易求解的,用追和赶的过程便可得到最终的结果;
(3)Cholesky方法
同样是将系数矩阵分解,但分解为三个矩阵
A=LDL’
其中D是对角阵,L是单位下三角阵,通过适当的方法可以求出D、L,然后通过解两个方程组:
Ly=b、L’x=y/D
即可得出最终的结果,并且相比平方根方法,该方法分解确实不在含有开放运算;
(4)追赶法
无论是消元过程还是回代过程,它们都是规模缩减技术的具体运用;设计机
理是将所给的三对角方程组化归为简单的二对角方程组来求解,来达到化繁
为简的目的。
四.实验体会
对实验过程进行总结,对比求解线性方程组的不同方法,指出每种方法的设计要点及应注意的事项,以及通过实验所获得的对线性方程组求解问题的各种解法的理解。
实验过程中重要的是对公式的理解,求解的过程顺序很重要,在代码的截图中标注有一些注释,有些是书本的,有些是自己加上的,为自己对代码的更详细的解释;在看懂代码的基础上,再打代码,这往往也不会出现一些小的错误,比如少写或错写代码等。
在矩阵分解方法中采用的是Doolittle分解,再者在编写代码时并不一定要按公式死死地写代码,可以进行一定的灵活改变,比如矩阵的对角元素是1时,可以直接定义为单位阵;在循环中需要对两个矩阵进行处理(L、U),当L的前两行已经知道,而U只知道一行,此时知道的不必再插入循环中进行求解,进行适当的代码处理,直接处理从U的第二行,L的第三行开始处理;
通过实验,很好地复习了第六章的内容,深入地理解了线性方程组的直接法,设计的过程都是要把方程组直接加工成某个三角方程组乃至对角方程组,而这些方程组可以通过一定的技巧来解出,从而能够比较精确和迅速地得到方程的解。