计算方法-线性方程组的直接法实验
实验报告一
实验一姓名:专业:班级:实验题目:解线性方程组的直接法日期:一、实验目的及意义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列元素的关系式:故。
线性方程组的直接解法迭代解法
广东金融学院实验报告课程名称:数值分析实验目的及要求实验目的:题一:通过数值实验,从中体会解线性方程组选主元的必要性和LU分解法的优点,以及方程组系数矩阵和右端向最的微小变化对解向最的影响。
比较各种直接接法在解线性方程组中的效果;题二:认识齐种迭代法收敛的含义、影响齐迭代法收敛速度的因素。
实验要求:题一:(1)在MATLAB中编写程序用列主元高斯消去法和LU分解求解上述方程组,输出曲b中矩阵A 及向量b和A二LU分解中的L及U, detA及解向量X.(2)将方程组中的2. 099999改为2. 1, 5. 900001改为5. 9,用列主元高斯消去法求解变换后的方程组,输出解向最x及detA,并与(1)中的结果比较。
(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵,再输入命令x=inv(A)*b,即可求出方程组的解。
请与列主元高斯消公法和LU分解法求出的解进行比较,体会选主元的方法具有良好的数值稳定性。
用MATLAB的内部曲数det求出系数行列式的值,并与(1)、(2)中输出的系数行列式的值进行比较。
(4)比较以上各种直接解法在解线性方程组中的效果。
题二:(1)选取不同的初始向M:X(0)及右端向最b,给泄迭代误差要求,用Jacobi迭代法和Gauss-Seidel迭代法求解,观察得到的序列是否收敛?若收敛,记录迭代次数,分析计算结果并得出你的结论。
列岀算法清单。
(2)用SOR迭代法求上述方程组的解,松弛系数血取1<69<2的不同的三个值,在< 10"5时停止迭代,记录迭代次数,分析计算结呆与松弛系数血的关系并得出你的结论。
(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵.再输入命令^inv(A)*b>即可求出上述各个方程组的解.并与上述三种方法求出的解进行比较。
请将比较结果列入卜表。
方程组的解X1 Xr■迭代次数误差楮确解Jacibi解法Gause・seidel 解法SOR 解法00= 60= 60=实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)1. Win72. Mat lab 7.0实验内容及步骤(包含简要的实验步骤流程) 实验内容:题一:解卜列线性方程组'10 -7‘X 】、(8、-3 2.099999 62Xr5.9000015-1 5 -15、12> 0< 1 >题二研究解线性方程组 做=b 迭代法的收敛性、收敛速度以及SOR 方法中/佳松弛因子的选取问题, 用迭代法求解做二b,其中・4 -1r■7 A=4 -81 ,b =-21-2 ■1515实验结果(包括程序或图表、结论陈述.数据记录及分析等,可附页)题一:直接解法解线性方程组(1)列主兀高斯消去法与LU 分解求解列主元高斯消去法:编写matalab 程序(见附录gaosi.m ),输出矩阵10.000 -7.000 0.000= 0.000 2.5000-5.000一 0.000 0.0006.0000020.000 0.000 0.000向量8 b =1 8.300 L5.0800J解向量:X = (0 ・-1 , 1 r I )7 其中系数行列式的值det (A )=762.00009LU 分解求解:编J matalab 程序(见附录zhjLU. m 和LU ・m ),执行输出:-1.5 2.300 5.080-3.0001.000000.00000.5000 -25000001.0000 0.2000 -24000000.9600 10.0000 -7.0000 0.0000 1.0000n = 0.0000-0.0000010.0000 2.3000 —0.0000 0.000015000000 57500000.0000 0.0000 0.0000 5.0800在matlab 命令窗II 输入L*U ,可以得到A 二L*U ,即分解结果正确。
线性方程组直接解法实验
实验一 线性方程组直接解法实验一、实验目的1.运用matlab 软件完成线性方程组的直接实验;2.通过实验,了解Doolittle 分解方法和列主元消去法解方程组的过程,并比较两种方法的优点。
二、实验题目分别用Doolittle 分解方法和列主元消去法解方程组123410-7018-3 2.09999962 5.9000015-15-1521021⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭x x x x . 输出A ,b ;Doolittle 分解方法的L 和U ;解向量x,det A ;列主元方法的行交换次序,解向量x,det A ;比较两种方法所得的结果。
三、实验原理1) Doolittle 分解方法的原理算法原理:应用高斯消去法解n 阶线性方程Ax b =经过1n -步消去后得出一个等价的上三角形方程组()()n n A x b =,对上三角形方程组用逐步回代就可以求出解来。
这个过程也可通过矩阵分解来实现。
将非奇异阵分解成一个下三角阵L 和上三角阵U 的乘积称为对矩阵A 的三角分解,又称LU 分解。
根据LU 分解,将Ax b =分解为Ly bUx y =⎧⎨=⎩形式,简化了求解问题。
程序框图:变量说明:ij a 为系数矩阵元素,i b 为常数矩阵系数,,ij ij l u 分别为下、上三角矩阵元素。
2)列主元消去法解方程组的原理算法原理:列选主元是当变换到第k步时,从k列的kk a及以下的各元素中选取绝对值a的位置上,然后再进行消元过程。
交换系数矩阵中最大的元素,通过行交换将其交换到kk的两行(包括常数项),相当于两个方程的位置交换了。
程序框图:Array变量说明:k表示消元到a为消元第k步时第k步,kk主对角线元素3)四、实验过程及结果1)Doolittle分解方法的输出结果----------计算实习题----------Page64 第1题用Doolittle分解方法解方程组A =10.0000 -7.0000 0 1.0000-3.0000 2.1000 6.0000 2.00005.0000 -1.0000 5.0000 -1.00002.0000 1.0000 0 2.0000b =8.00005.90005.00001.0000L =1.0e+006 *0.0000 0 0 0-0.0000 0.0000 0 00.0000 -2.5000 0.0000 00.0000 -2.4000 0.0000 0.0000 U =1.0e+007 *0.0000 -0.0000 0 0.00000 -0.0000 0.0000 0.00000 0 1.5000 0.57500 0 0 0.0000 X =-0.0000-1.00001.00001.0000det(A)值为-762.00009000----------输出完毕----------2)列主元消去法输出结果----------计算实习题----------Page64 第1题列主元消去法解方程组A =10.0000 -7.0000 0 1.0000-3.0000 2.1000 6.0000 2.00005.0000 -1.0000 5.0000 -1.00002.0000 1.0000 0 2.0000b =8.00005.90005.00001.0000X =0.0000-1.00001.00001.0000detA值为-762.00009000----------输出完毕----------五、实验分析1.运用LU分解法可以成批地解方程组,且速度快.若c先求LU=A3,再解(LU)x=b,则要重新计算,计算量增加;如果按照上述方法计算,能够减少运算次数,加快运算速度.3. ⑴无论当n=10、n=100、n=1000时,x1与x2的值都相等,且随着n的增大,变化的只是解的中间部分数字,头、前后几位数都没有变化.⑵高斯消去法应用于三对角方程组得到的就是所谓的“追赶法”.追赶法不需要对零元素计算,只有6n-5次乘除法计算量,求解速度快.且当系数矩阵对角占优时数值稳定,是解三对角方程组的优秀解法.⑶用LU分解法解此方程组速度慢.顺序高斯消去法实际上就是将方程组的系数矩阵分解成单位下三角矩阵与上三角矩阵的乘积.顺序高斯消去法的消元过程相当于LU分解过程和Ly=b的求解,回代过程则相当于解线性方程组Ux=y,故其求解速度慢.六、附原程序1)Doolittle分解方法原程序fprintf('----------计算实习题----------\n')fprintf('Page64 第1题用Doolittle分解方法解方程组\n')A=[10 -7 0 1 ; -3 2.099999 6 2 ;5 -1 5 -1 ; 2 1 0 2];b=[8;5.900001;5;1];n=length(A);U=zeros(n,n);L=eye(n,n);U(1,:)=A(1,:);L(2:n,1)=A(2:n,1)/U(1,1);for i=2:n;U(i,i:n)=A(i,i:n)-L(i,1:i-1)*U(1:i-1,i:n);L(i+1:n,i)=(A(i+1:n,i)-L(i+1:n,1:i-1)*U(1:i-1,i))/U(i,i); endY=zeros(n);Y(1)=b(1);for i=2:nY(i)=b(i)-L(i,1:i-1)*Y(1:i-1,1);endX=zeros(n,1);if det(U)==0;X=0;elseX(n)=Y(n)/U(n,n);for i=n-1:-1:1X(i)=(Y(i)-U(i,i+1:n)*X(i+1:n,1))/U(i,i);endendAbLUXfprintf('det(A)值为%9.8f\n',det(A))fprintf('----------输出完毕 ----------\n')2)列主元消去法原程序fprintf('----------计算实习题----------\n')fprintf('Page64 第1题列主元消去法解方程组\n')A=[10 -7 0 1 ; -3 2.099999 6 2 ;5 -1 5 -1 ; 2 1 0 2];b=[8;5.900001;5;1];C=[A b];n=length(A);D=zeros(n,n+1);l=zeros(n,1);for i=1:nD=C;k=min(find(C(i:n,i)==max(C(i:n,i))));C(i,i:n+1)=D(k+i-1,i:n+1);C(k+i-1,i:n+1)=D(i,i:n+1);l(i+1:n,1)=C(i+1:n,i)/C(i,i);C(i+1:n,i:n+1)= C(i+1:n,i:n+1)- l(i+1:n,1)*C(i,i:n+1); endX=zeros(n,1);X(n)=C(n,n+1)/C(n,n);for i=n-1:-1:1X(i)=(C(i,n+1)-C(i,i+1:n)*X(i+1:n,1))/C(i,i); endAbXfprintf('detA值为%9.8f\n',det(A))fprintf('----------输出完毕----------\n')。
MATLAB实验一 解线性方程组的直接法
输出 Ax b 中系数 A LU 分解的矩阵 L 和 U ,解向量 x 和 det(A) ;用列主元法 的行交换次序解向量 x 和求 det(A) ;比较两种方法所得结果。
2、用列主高斯消元法解线性方程组 Ax b 。
3.01 6.03 1.99 x1 1 4.16 1.23 x 2 1 (1) 、 1.27 0.987 4.81 9.34 x 1 3 3.00 6.03 1.99 x1 1 4.16 1.23 x 2 1 (2) 、 1.27 0.990 4.81 9.34 x 1 3
index = 1 3、在 MATLAB 窗口:
A=[10 7 8 7;7 5 6 5;8 6 10 9;7 5 9 10]; b=[32 23 33 31]'; x=A\b b1=[32.1 22.9 33.1 30.9]'; x1=A\b1 A1=[10 7 8.1 7.2;7.08 5.04 6 5;8 5.98 9.89 9;6.99 5 9 9.98]; x2=A1\b delta_b=norm(b-b1)/norm(b) delta_A=norm(A-A1)/norm(A) delta_x1=norm(x-x1)/norm(x) delta_x2=norm(x-x2)/norm(x)
二. 实验要求 1、按照题目要求完成实验内容; 2、写出相应的 Matlab 程序; 3、给出实验结果(可以用表格展示实验结果); 4、分析和讨论实验结果并提出可能的优化实验。 5、写出实验报告。 三. 实验步骤 1、用 LU 分解及列主元高斯消去法解线性方程组
7 10 3 2.099999 a) 5 1 2 1 1 x1 8 6 2 x 2 5.900001 , 5 1 x3 5 0 2 1 x 4 0
实验2_求解线性方程组直接法(完成版)
数值分析实验报告二求解线性方程组的直接方法(2学时)一 实验目的1.掌握求解线性方程组的高斯消元法及列主元素法; 2. 掌握求解线性方程组的克劳特法; 3. 掌握求解线性方程组的平方根法。
二 实验内容1.用高斯消元法求解方程组(精度要求为610-=ε):1231231233272212240x x x x x x x x x -+=⎧⎪-+-=-⎨⎪-+=⎩ 2.用克劳特法求解上述方程组(精度要求为610-=ε)。
3. 用平方根法求解上述方程组(精度要求为610-=ε)。
4. 用列主元素法求解方程组(精度要求为610-=ε):1231231233432222325x x x x x x x x x -+=⎧⎪-+-=⎨⎪--=-⎩ 三 实验步骤(算法)与结果1. 高斯消元法求解根据算法思想用C 语言编程(源程序见附录2.1) 编译结果如下图:2. 克劳特法求解根据算法思想用C 语言编程(源程序见附录2.2)编译结果如下图:3平方根法求解根据算法思想用C语言编程(源程序见附录2.3)编译结果如下图:4列主元素法求解根据算法思想用C语言编程(源程序见附录2.4)编译结果如下图:四实验收获与教师评语1.实验收获:对于这次实验,我可以锻炼到上机实验的能力,并且第一次感受到数学知识在现实生活中的应用,也是第一次运用计算机解决数学问题。
另外,正是因为这次上机实验,让我重温了有些遗忘的编程知识。
2.教师评语:附录:2.1至2.4源程序代码2.1 #include <stdio.h>#define N 8void main(){floatsum,a[N][N]={0},u[N][N]={0},l[N][ N]={0},z[N]={0},x[N]={0};int n,i,j,k;printf("input the number of roots:");/*方程的个数小于8*/scanf("%d",&n);printf("input xishu matrix:\n"); for(i=1;i<=n;i++)for(j=1;j<=n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<=n;i++)l[i][i]=1;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i>j){for(k=0,sum=0;k<=j-1;k++)sum+=l[i][k]*u[k][j];l[i][j]=(a[i][j]-sum)/u[j][j];}else{for(k=0,sum=0;k<=i-1;k++)sum+=l[i][k]*u[k][j];u[i][j]=a[i][j]-sum; }}for(i=1,j=n+1;i<=n;i++){for(k=0,sum=0;k<=i;k++)sum+=l[i][k]*z[k];z[i]=a[i][j]-sum;}for(i=n;i>=1;i--){sum=0;for(k=i+1;k<=n;k++)sum+=u[i][k]*x[k]; x[i]=(z[i]-sum)/u[i][i];}printf("changing fangcheng xi shu is:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%-10g",u[i][j]); printf("%-10g\n",z[i]);}for(i=1;i<=n;i++)printf("x(%d)=%-g\n",i,x[i]); getch();}2.2#include <conio.h>#include <stdio.h>#define N 8void main(){floatsum,a[N][N]={0},u[N][N]={0},l[N][ N]={0},z[N]={0},x[N]={0};int n,i,j,k;printf("input the number of roots:");/*方程的个数小于8*/scanf("%d",&n);printf("input xishu matrix:\n"); for(i=1;i<=n;i++)for(j=1;j<=n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<=n;i++)u[i][i]=1;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i>=j){for(k=0,sum=0;k<=j-1;k++)sum+=l[i][k]*u[k][j];l[i][j]=a[i][j]-sum; }else{for(k=0,sum=0;k<=i-1;k++)sum+=l[i][k]*u[k][j];u[i][j]=(a[i][j]-sum)/l[i][i];}}for(i=1,j=n+1;i<=n;i++){for(k=0,sum=0;k<=i;k++)sum+=l[i][k]*z[k];z[i]=(a[i][j]-sum)/l[i][i];}for(i=n;i>=1;i--){sum=0;for(k=i+1;k<=n;k++)sum+=u[i][k]*x[k];x[i]=z[i]-sum;}printf("changing fangcheng xi shu is:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%-10g",u[i][j]); printf("%-10g\n",z[i]);}for(i=1;i<=n;i++)printf("x(%d)=%-g\n",i,x[i]); getch();}2.3#include <conio.h>#include <stdio.h>#include <math.h>#define N 8void main(){floatsum,a[N][N]={0},u[N][N]={0},l[N][ N]={0},z[N]={0},x[N]={0};int n,i,j,k;printf("input the number of roots:");/*方程的个数小于8*/ scanf("%d",&n);printf("input xishu matrix:\n"); for(i=1;i<=n;i++)for(j=1;j<=n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i>j){for(k=0,sum=0;k<=j-1;k++)sum+=l[i][k]*l[j][k];l[i][j]=(a[i][j]-sum)/l[j][j];u[j][i]=l[i][j];}if(i==j){for(k=0,sum=0;k<=i-1;k++)sum+=l[i][k]*l[i][k];l[i][i]=sqrt(a[i][i]-sum);u[i][i]=l[i][i];}}for(i=1,j=n+1;i<=n;i++){for(k=0,sum=0;k<=i;k++)sum+=l[i][k]*z[k];z[i]=(a[i][j]-sum)/l[i][i];}for(i=n;i>=1;i--){sum=0;for(k=i+1;k<=n;k++)sum+=u[i][k]*x[k];x[i]=(z[i]-sum)/l[i][i];}printf("changing fangcheng xi shu is:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%-10g",u[i][j]); printf("%-10g\n",z[i]);}for(i=1;i<=n;i++)printf("x(%d)=%-g\n",i,x[i]); getch();}2.4#include <stdio.h>#include <math.h>#define N 8void main(){ int i,j,k,n;floata[N][N],l[N][N],u[N][N],z[N],x1[N ],max,x;for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]=u[i][j]=l[i][j]=0;z[0]=0; printf("input the number of roots:");scanf("%d",&n);printf("input xishu matrix:\n");for(i=1;i<=n;i++)for(j=1;j<=n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<n;i++){ max=fabs(a[i][i]);k=i;for(j=i+1;j<=n;j++)if(fabs(a[j][i])>max){ max=fabs(a[j][i]);k=j;} for(j=i;j<=n+1;j++){ x=a[i][j];a[i][j]=a[k][j];a[k][j]=x;}for(j=i+1;j<=n;j++){ l[j][i]=a[j][i]/a[i][i];a[j][i]=0;for(k=i+1;k<=n+1;k++) a[j][k]=a[j][k]-l[j][i]*a[i][k]; }z[i]=a[i][n+1];}z[n]=a[n][n+1];for(i=1;i<=n;i++)for(j=1;j<=n;j++)u[i][j]=a[i][j];for(i=n;i>0;i--){ k=i+1;x=0;while(k<=n){ x+=u[i][k]*x1[k];k++;}x1[i]=(z[i]-x)/u[i][i];}for(i=1;i<=n;i++)for(j=1;j<=n;j++){ printf("%-10g",u[i][j]);if(j==n)printf("%-10g\n",z[i]);}for(i=1;i<=n;i++)printf("x%d=%-10g\n",i,x1[i]);getch();}。
数值计算方法-第5章_解线性方程组的直接法
本章讲解直接法
5.1 消元法
我们知道,下面有3种方程的解我们可以直接求出:
①
n次运算
A
diag(a11, a22 ,
, ann )
xi
bi aii
,i
1,
,n
②
(n+1)n/2次运算
l11
A
l21 ln1
l22 ln2
(aik
k 1
liklkr ) r 1 lkk
,i k 1, , n
因此不常用
又 l11
1
l11
l21 l22
ln1
ln2
lnn
l '21 l 'n1
1 l'n2
1
l22
lnn
则有
A L~D~D~T L~T LDLT
L~
D~
1
L
l21 ln1
lnn
xi
bi
i 1
lij x j
j 1
lii
,i
1,
,n
③
(n+1)n/2次运算
u11
A
u12 u22
u1n
u2n unn
xi
bi
n
uij x j
j i 1
uii
,i
n,
,1
对方程组,作如下的变换,解不变 ①交换两个方程的次序 ②一个方程的两边同时乘以一个非0的数 ③一个方程的两边同时乘以一个非0数,加到另一个方程
1 ln2
1
d1
D
d2
dn
a11 a12
a21 a22
解线性方程组实验
实验报告专用纸实验项目名称解线性方程组的直接法课程名称数值方法教师评语及成绩:实验成绩:教师签字:(请按照实验报告的有关要求书写。
一般必须包括:1、实验目的;2、实验内容;3、实验步骤与方法;4、实验数据与程序清单;5、出现的问题与解决方法;6、实验结果、结果分析与体会等内容)1、实验目的(1)掌握Gauss消元法及Gauss列主元消去法,能用这两种方法求解线性方程组;(2)掌握平方根法与追赶法;(3)掌握相应数值算法的程序编写;(4)理解方程组的性态、条件数及误差分析。
2、实验内容1.应用高斯消元法和高斯列主元素法解线性方程组Ax=b。
2.解线性方程组Ax=b的LU分解法。
用熟悉的算法语言编写程序,用高斯消去法和高斯列主元消去法求解方程组,输出Ax=b 中矩阵A、b、解向量x及detA。
3、实验步骤和方法(1)要求上机实验前先编写出程序代码;(2)编辑录入程序;(3)调试程序并记录调试过程中出现的问题及修改程序的过程;(4)经反复调试后,运行程序并验证程序运行是否正确;(5)记录运行时的输入和输出;(6)对程序的运行结果进行分析;(7)根据实验情况和结果撰写并提交实验报告。
4、实验原理(1)实验结果图1Gauss消元法图2Gauss消元法近似为0(2)结果分析在Gauss消元法中,可以看到3的值是一个非常接近于0的数,如果将消元后的系数矩阵打印出来,可以看到消元后的系数矩阵并不是一个真正的上三角矩阵,下三角部分有几处是绝对值极小的值,这是由于计算机的浮点计算造成的,浮点在计算机中本身就不是一个精确的数,在消元的过程中,一些浮点运算有误差,最后得到的是近似值而不是0。
数值分析实验报告
实验五 解线性方程组的直接方法实验5.1 (主元的选取与算法的稳定性)问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。
主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。
实验内容:考虑线性方程组n n n R b R A b Ax ∈∈=⨯,,编制一个能自动选取主元,又能手动选取主元的求解线性方程组的Gauss 消去过程。
实验要求:(1)取矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=1415157,6816816816 b A ,则方程有解T x )1,,1,1(* =。
取n=10计算矩阵的条件数。
让程序自动选取主元,结果如何?(2)现选择程序中手动选取主元的功能。
每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果。
若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。
(3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。
(4)选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。
重复上述实验,观察记录并分析实验结果。
思考题一:(Vadermonde 矩阵)设⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=∑∑∑∑====n i i n n i i ni i n i i n n n n n n nx x x x b x x x x x x x x x x x x A 002010022222121102001111 ,, 其中,n k k x k ,,1,0,1.01 =+=,(1)对n=2,5,8,计算A 的条件数;随n 增大,矩阵性态如何变化?(2)对n=5,解方程组Ax=b ;设A 的最后一个元素有扰动10-4,再求解Ax=b(3)计算(2)扰动相对误差与解的相对偏差,分析它们与条件数的关系。
解线性方程组的直接方法
解线性方程组的直接方法一、高斯消元法高斯消元法是解线性方程组的一种常用且直接的方法。
它的基本思想是通过一系列的代数运算,将方程组化为一个三角方程组,然后从最后一行开始,逐步回代求解未知数。
下面以一个二元一次方程组为例,说明高斯消元法的具体步骤:例如,给定方程组:a₁₁x₁+a₁₂x₂=b₁a₂₁x₁+a₂₂x₂=b₂其中,a₁₁,a₁₂,a₂₁,a₂₂,b₁,b₂为已知系数。
1.检查a₁₁的值是否为0,若为0则交换第一行与非零行。
2.将第一行的每个元素除以a₁₁,使a₁₁成为13.将第一行乘以(-a₂₁)并加到第二行上,使第二行的第一个元素变为0。
4.引入一个新的未知数y₂=a₂₁x₁+a₂₂x₂,并代入第二行,化简方程组。
5.使用回代法求解方程组。
高斯消元法的优势在于其直接的解题思路和较高的计算精度,但是其缺点是计算复杂度较高,对于大规模的方程组不太适用。
二、逆矩阵法逆矩阵法是解线性方程组的另一种直接方法,它通过求解方程组的系数矩阵的逆矩阵,并将其与方程组的常数向量相乘,得到方程组的解向量。
下面以一个三元一次方程组为例,说明逆矩阵法的具体步骤:例如,给定方程组:a₁₁x₁+a₁₂x₂+a₁₃x₃=b₁a₂₁x₁+a₂₂x₂+a₂₃x₃=b₂a₃₁x₁+a₃₂x₂+a₃₃x₃=b₃其中,a₁₁,a₁₂,a₁₃,a₂₁,a₂₂,a₂₃,a₃₁,a₃₂,a₃₃,b₁,b₂,b₃为已知系数。
1.计算系数矩阵A的行列式D=,A。
2. 求解系数矩阵A的伴随矩阵Adj(A)。
3. 计算逆矩阵A⁻¹=Adj(A)/D。
4.将常数向量b用列向量表示。
5.计算解向量x=A⁻¹b。
逆矩阵法的优势在于其求解过程相对简单,计算量较小,并且不需要对系数矩阵进行消元操作。
但是逆矩阵法的限制在于当系数矩阵不可逆时无法使用。
三、克莱姆法则克莱姆法则是解线性方程组的另一种直接方法,它通过定义克莱姆行列式和克莱姆向量,利用行列式的性质求解方程组的解向量。
计算方法实验:解线性方程组的直接法
实验二解线性方程组的直接法一、实验目的用列主元素高斯消去法和三角分解法解线性方程组Ax=b。
式中,A为n阶非奇异方阵,x,b是n阶列向量,并分析选主元素的重要性。
二、实验方法(1)列主元素高斯消去法通过变换,将系数矩阵换成等价的上三角矩阵,在每步消元过程中,选列主元素。
对k=1,2,……n-1,逐次计算l ik=a ik(k-1)/a kk(k-1) (i=k+1,k+2,……,n)a ij(k)=a ij(k-1)-l ik a kj(k-1) (i,j=k+1,k+2,……,n)b i(k)=b i(k-1)-l ik b k(k-1) (i=k+1,k+2,……,n)逐步回代气的原方程组的解X n=b i(n-1)/a nn(n-1)X k=(b k(k-1)_a kj(k-1)x j)/a kk(k-1) (k=n-1,n-2, (1)(2)直接三角分解法由于两个矩阵相等就是它们的对应元素相等,因此通过比较A与LU的对应元素,即可得到直接计算L,U的元素的公式。
设A=L×U,其中U的第一行、L的第一列的元素分别为对(依次:U的第二行,L的第二列,U的第三行,L的第三列……),有由上述两种方法得到矩阵A的LU分解后,求解Ly=b与Ux=y的计算公式为∑+=n1kj三、实验内容解下列方程组·=四、实验程序(1)列主元素高斯消去法(2)直接三角分解法0147.06721.109998.42371.13142.17643.89217.44129.35435.15330.27875.15301.04017.31651.18326.31348.14321xxxx9237.164231.183941.65342.9五、实验结果(仅供参考)精确解为:(1,1,1,1)T六、结果分析实验的数学原理很容易理解,也容易上手。
把运算的结果带入原方程组,可以发现符合的还是比较好。
这说明列主元消去法计算这类方程的有效性。
线性方程组直接解法实验
实验一 线性方程组直接解法实验一、实验目的1.运用matlab 软件完成线性方程组的直接实验;2.通过实验,了解Doolittle 分解方法和列主元消去法解方程组的过程,并比较两种方法的优点。
二、实验题目分别用Doolittle 分解方法和列主元消去法解方程组123410-7018-3 2.09999962 5.9000015-15-1521021⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭x x x x . 输出A ,b ;Doolittle 分解方法的L 和U ;解向量x,det A ;列主元方法的行交换次序,解向量x,det A ;比较两种方法所得的结果。
三、实验原理1) Doolittle 分解方法的原理算法原理:应用高斯消去法解n 阶线性方程Ax b =经过1n -步消去后得出一个等价的上三角形方程组()()n n A x b =,对上三角形方程组用逐步回代就可以求出解来。
这个过程也可通过矩阵分解来实现。
将非奇异阵分解成一个下三角阵L 和上三角阵U 的乘积A LU =称为对矩阵A 的三角分解,又称LU 分解。
根据LU 分解,将Ax b =分解为Ly bUx y=⎧⎨=⎩形式,简化了求解问题。
程序框图:变量说明:ij a 为系数矩阵元素,i b 为常数矩阵系数,,ij ij l u 分别为下、上三角矩阵元素。
开始输入a ij ,b ii,j=1,2,…,na i1=l i1=a i1/a 11i=2,3,…,nk=2akj=ukj=akj-∑l ktj=k,…,nk=n?k=k+1y 1=b 1,y i =b i -∑l ij y ji=2,…,n x n =y n /u nnx i =(y i -∑u ij x j )/u iii=n-1,…2,1是否a kj =l jk =(a jk -∑l it u tk )/u kkj=k,…,n2)列主元消去法解方程组的原理算法原理:列选主元是当变换到第k步时,从k列的kk a及以下的各元素中选取绝对值最大的元素,通过行交换将其交换到kka的位置上,然后再进行消元过程。
计算方法二实验二 解方程组的直接法
山西大学计算机与信息技术学院实验报告
六、实验分析
1全主元计算量很大,只使用列主元就可,列主元是一列的最大的。
全主元就是所有元素找最大的放在顺序主子阵左上角。
2高斯消去法是一个古老的求解线性方程组的方法,但由它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法。
问题主要集中在循环控制中,循环次数多了一次或者缺少了一次,导致数据错误,一些基本的编程语句在语法上也会由于生疏而产生许多问题,但是语句的错误由于系统会提示,比较容易进行修改,数据计算过程中的一些逻辑错误,比如循环变量的控制,这些系统不会提示错误,需要我们细心去发现错误,不断修正,调试。
教师
评语。
数值分析实验报告
实验五 解线性方程组的直接方法实验5.1 (主元的选取与算法的稳定性) 问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。
主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。
实验内容:考虑线性方程组n n n R b R A b Ax ∈∈=⨯,,编制一个能自动选取主元,又能手动选取主元的求解线性方程组的Gauss 消去过程。
实验要求:(1)取矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=1415157,6816816816 b A ,则方程有解T x )1,,1,1(* =。
取n=10计算矩阵的条件数。
让程序自动选取主元,结果如何?(2)现选择程序中手动选取主元的功能。
每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果。
若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。
(3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。
(4)选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。
重复上述实验,观察记录并分析实验结果。
思考题一:(Vadermonde 矩阵)设⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=∑∑∑∑====n i i n n i i ni i n i i n n n n n n nx x x x b x x x x x x x x x x x x A 002010022222121102001111 ,, 其中,n k k x k ,,1,0,1.01 =+=,(1)对n=2,5,8,计算A 的条件数;随n 增大,矩阵性态如何变化?(2)对n=5,解方程组Ax=b ;设A 的最后一个元素有扰动10-4,再求解Ax=b(3)计算(2)扰动相对误差与解的相对偏差,分析它们与条件数的关系。
- 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的第三行开始处理;
通过实验,很好地复习了第六章的内容,深入地理解了线性方程组的直接法,设计的过程都是要把方程组直接加工成某个三角方程组乃至对角方程组,而这些方程组可以通过一定的技巧来解出,从而能够比较精确和迅速地得到方程的解。