方程组直接三角分解法(精选)
- 格式:ppt
- 大小:963.00 KB
- 文档页数:20
线性代数方程组直接法题1.⎪⎪⎪⎭⎫⎝⎛-=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫⎝⎛-----710413221232321x x x 程组用直接三角分解法解方2.21,,4321A A A A ∞⎥⎦⎤⎢⎣⎡--=,求设 3.用顺序高斯消去法解⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛565331743532321x x x4.用列主元高斯消去法解⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛-20111.0310********x x x5.用直接三角分解法解⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛7173530103421101002014321x x x x6.用追赶法求解方程组⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛022112111131124321x x x x7.试用平方根法解下列对称正定方程组⎪⎪⎪⎭⎫ ⎝⎛-=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--103422484548416321x x x8.用高斯-若当消去法求下列矩阵的逆⎪⎪⎪⎭⎫ ⎝⎛---=112221111A作业1.用追赶法解三对角方程组Ax=b,其中A=⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--------2100012100012100012100012,b=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛00001 作业2.用改进的平方根法解方程组⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛---654131*********x x x 作业3.设A=⎪⎪⎭⎫⎝⎛3.01.05.06.0,计算21A A A ,,∞ 作业4.设A 为非奇异矩阵,求证:∞∞≠∞-=yAy Ay 01min1作业5.下述矩阵能否分解为LU (其中L 为单位下三角阵,U 为上三角阵)?若能分解,那么分解是否是唯一?⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛=461561552621,133122111,764142321C B A解线性方程组的迭代法1.设方程组Ax=b,⎪⎪⎪⎭⎫⎝⎛-=122111221A ,试讨论解此方程组的J 法和GS 法的收敛性。
三角分解法解线性方程组线性方程组是数学中一类重要的方程组,它包含了一系列线性方程。
在实际问题中,线性方程组有时需要通过三角分解法进行求解。
三角分解法是一种常用的线性方程组求解方法,它通过将方程组转化为上、下三角形矩阵进行分解,从而求解出未知数的值。
本文将详细介绍三角分解法的步骤及实际案例。
首先,我们来介绍三角矩阵的概念。
上三角矩阵是指除了主对角线上方的元素均为0的矩阵,下三角矩阵则是指除了主对角线下方的元素均为0的矩阵。
我们的目标是将线性方程组转化为上、下三角形矩阵进行求解。
步骤1:将线性方程组表示为矩阵形式,即AX=B,其中A为系数矩阵,X为未知数向量,B为常数向量。
步骤2:进行三角分解,将系数矩阵A分解为一个上三角矩阵U和一个下三角矩阵L,即A=LU。
其中L为下三角矩阵,U为上三角矩阵。
步骤3:将方程组AX=B进行变量代换,令Y=UX。
此时,方程组变为LY=B。
步骤4:解得矩阵Y,再通过回代法求解出未知数向量X。
下面我们通过一个实际案例来详细说明三角分解法的应用。
案例:有三个变量x,y,z的线性方程组:2x+y+z=4x+3y+2z=133x+2y+3z=15首先将该方程组表示为矩阵形式:⎛211⎛⎛x⎛⎛4⎛⎛132⎛⎛y⎛=⎛13⎛⎛323⎛⎛z⎛⎛15⎛然后进行三角分解,将系数矩阵A分解为上三角矩阵U和下三角矩阵L:A=⎛211⎛=⎛100⎛⎛211⎛⎛132⎛⎛110⎛⎛021⎛⎛323⎛⎛321⎛⎛001⎛接下来,将方程组AX=B进行变量代换,令Y=UX,即LY=B:⎛100⎛⎛Y₁⎞⎛4⎛⎛110⎛⎛Y₂⎟=⎛13⎛⎛021⎛⎛Y₃⎠⎝15⎛我们可以通过高斯消元法求解上述方程组,得到Y的解:Y₁=4Y₂=9Y₃=-2最后,通过回代法求解未知数向量X:X₃=Y₃=-2X₂=Y₂-2X₃=9-2(-2)=13X₁=Y₁-X₂=4-13=-9因此,该线性方程组的解为:x=-9,y=13,z=-2三角分解法是一种常用且有效的线性方程组求解方法。
第二章线性方程组的直接法在近代数学数值计算和工程应用中,求解线性方程组是重要的课题。
例如,样条插值中形成的关系式,曲线拟合形成的法方程等,都落实到解一个元线性方程组,尤其是大型方程组的求解,即求线性方程组(2.1)的未知量的数值。
(2.1)其中ai j,bi为常数。
上式可写成矩阵形式Ax = b,即(2.2)其中,为系数矩阵,为解向量,为常数向量。
当detA=D0时,由线性代数中的克莱姆法则,方程组的解存在且惟一,且有为系数矩阵的第列元素以代替的矩阵的行列式的值。
克莱姆法则在建立线性方程组解的理论基础中功不可没,但是在实际计算中,我们难以承受它的计算量。
例如,解一个100阶的线性方程组,乘除法次数约为(101·100!·99),即使以每秒的运算速度,也需要近年的时间。
在石油勘探、天气预报等问题中常常出现成百上千阶的方程组,也就产生了各种形式方程组数值解法的需求。
研究大型方程组的解是目前计算数学中的一个重要方向和课题。
解方程组的方法可归纳为直接解法和迭代解法。
从理论上来说,直接法经过有限次四则运算,假定每一步运算过程中没有舍入误差,那么,最后得到方程组的解就是精确解。
但是,这只是理想化的假定,在计算过程中,完全杜绝舍入误差是不可能的,只能控制和约束由有限位算术运算带来的舍入误差的增长和危害,这样直接法得到的解也不一定是绝对精确的。
迭代法是将方程组的解看作某种极限过程的向量极限的值,像第2章中非线性方程求解一样,计算极限过程是用迭代过程完成的,只不过将迭代式中单变量换成向量而已。
在用迭代算法时,我们不可能将极限过程算到底,只能将迭代进行有限多次,得到满足一定精度要求的方程组的近似解。
在数值计算历史上,直接解法和迭代解法交替生辉。
一种解法的兴旺与计算机的硬件环境和问题规模是密切相关的。
一般说来,对同等规模的线性方程组,直接法对计算机的要求高于迭代法。
对于中等规模的线性方程组,由于直接法的准确性和可靠性高,一般都用直接法求解。
第三章 解线性方程组的直接法3.1 引言许多科学技术问题要归结为解含有多个未知量x 1, x 2, …, x n 的线性方程组。
例如,用最小二乘法求实验数据的曲线拟合问题,三次样条函数问题,解非线性方程组的问题,用差分法或有限元法解常微分方程、偏微分方程的边值等,最后都归结为求解线性代数方程组。
关于线性方程组的数值解法一般有两类:直接法和迭代法。
1. 直接法直接法就是经过有限步算术运算,可求得线性方程组精确解的方法(假设计算过程中没有舍 入误差)。
但实际计算中由于舍入误差的存在和影响,这种方法也只能求得线性方程组的近似解。
本章将阐述这类算法中最基本的高斯消去法及其某些变形。
2. 迭代法迭代法就是用某种极限过程去逐步逼近线性方程组精确解的方法,迭代法需要的计算机存储 单元少、程序设计简单、原始系数矩阵在计算过程中不变,这些都是迭代法的优点;但是存在收敛性和收敛速度的问题。
迭代法适用于解大型的稀疏矩阵方程组。
为了讨论线性方程组的数值解法,需要复习一些基本的矩阵代数知识。
3.1.1 向量和矩阵 用nm ⨯R表示全部n m ⨯实矩阵的向量空间,nm C⨯表示全部n m ⨯复矩阵的向量空间。
()⎪⎪⎪⎪⎪⎭⎫⎝⎛==⇔∈⨯nn n n n n ij nm a a aa a aa a a a212222111211A R A 此实数排成的矩形表,称为m 行n 列矩阵。
⎪⎪⎪⎪⎪⎭⎫⎝⎛=⇔∈n n x x x 21x R x x 称为n 维列向量矩阵A 也可以写成)(n 21a ,,a ,a A = 其中 a i 为A 的第i 列。
同理⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=T T T n 21b b b A其中T i b 为A 的第i 行。
矩阵的基本运算:(1) 矩阵加法 )( ,n m n m R C ,R B ,R A B A C ⨯⨯⨯∈∈∈+=+=n m ij ij ij b a c . (2) 矩阵与标量的乘法 ij j a ci αα== ,A C (3) 矩阵与矩阵乘法 p nk kjik b acij ⨯⨯⨯=∈∈∈==∑m p n n m R C ,R B ,R A AB C ( ,1(4) 转置矩阵 ji ij T nm a c ==∈⨯ , ,A C RA(5) 单位矩阵 ()n n ⨯∈=R e ,,e ,e I n 21 ,其中 ()Tk e 0,0,1,0,0 = k=1,2,…,n(6) 非奇异矩阵 设nn ⨯∈RA ,nn ⨯∈RB 。
矩阵直接三角分解法算法将方程组Ax=b 中的A 分解为A=LU ,其中L 为单位下三角矩阵,U 为上三角矩阵,则方程组Ax=b 化为解2个方程组Ly=b ,Ux=y 。
具体算法:○1对j=1,2,3,…,n 计算 U 1j =a 1j对i=2,3,…,n 计算L i1=a i1/a 11○2对k=2,3…,n: a . 对j=k ,k+1,…,n 计算U kj=a kj -∑LkqUqj k−1q=1b.对i=k+1,k+2,…,n 计算l ik =(a ik -)∑LiqUqk k−1q=1/u kk○3y 1=b 1对k=2,3…,n 计算 Y k =b k -∑LkqUq k−1q=1○4X n =y n /U nn ,对k=n -1,n -2,…2,1计算 X k =(y k -∑UkqXq n q=k+1/U kk注:注由于计算u 的公式与计算y 的公式形式上一样,故可直接对增广矩阵[A|b]=[ a11 a12…a1n a1,n +1a21 a22…a2n a2,n +1:: ::an1 an2…ann an,n +1]施行算法○2○3,此时U 的第n+1列元素即为y 。
程序与实例求方程组Ax=bA=[1 2 −12 85 4 7 −2−3 7 9 56 −12 −8 3],b=[2741149]程序#include<stdio.h>void main(){float x[4];int i;float a[4][5]={1,2,-12,8,27,5,4,7,-2,4,-3,7,9,5,11,6,-12,-8,3,49};void DirectLU(float*,int,float[]);DirectLU(a[0],4,x);for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);}void DirectLU(float *u,int n,float x[]){int i,r,k;for(r=0;r<=n-1;r++){for(i=r;i<=n;i++)for(k=0;k<=r-1;k++)*(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i));for(i=r+1;i<=n-1;i++){for(k=0;k<=r-1;k++)*(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r));*(u+i*(n+1)+r)/=*(u+r*(n+1)+r);}}for(i=n-1;i>=0;i--){for(r=n-1;r>=i+1;r--)*(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r];x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i));}}运行结果。
三角分解法解方程组三角分解法是一种用于求解线性方程组的数值方法。
这种方法通常被称为高斯消元法,它是由卡尔·高斯在19世纪提出的。
在三角分解法中,我们首先将线性方程组转化为一个三角矩阵的形式,然后使用递推的方法求解方程组。
假设我们有一个n元线性方程组,其中有n个未知数,则线性方程组可以表示为:a11x1 + a12x2 + … + a1n xn = b1 a21x1 + a22x2 + … + a2n xn = b2 … an1x1 + an2x2 + … + ann*xn = bn要使用三角分解法求解这个方程组,我们需要将方程组转化为一个三角矩阵的形式,并使用递推的方法求解。
首先,我们要使用高斯消元法将方程组转化为上三角矩阵的形式,这样就可以使用递推的方法求解了。
具体来说,我们需要进行如下步骤:1.对于第一个方程,我们将a11变为1,然后将其余的系数除以a11。
2.对于第二个方程,我们将a22变为1,然后将其余的系数除以a22,并将a21乘上第一个方程的系数a12。
3.对于第三个方程,我们将a33变为1,然后将其余的系数除以a33,并将a31和a32乘上第一个和第二个方程的系数a12和a22。
以此类推,直到我们消去了所有的系数,并使得方程组的系数矩阵变为一个上三角矩阵。
这样,我们就可以使用递推的方法来求解方程组了。
具体来说,我们从最后一个方程开始递推,并使用已知的xn的值来解出xn-1的值,然后再使用xn-1的值来解出xn-2的值,以此类推,直到解出x1的值。
例如,假设我们已经将方程组转化为了如下形式:a11x1 + a12x2 + a13x3 = b1 0x1 + a22x2 + a23x3 = b2 0x1 + 0x2 + a33*x3 = b3那么我们可以使用递推的方法求解方程组,具体来说:使用已知的x3的值来解出x2的值:x2 = (b2 - a23*x3) / a22使用已知的x2的值来解出x1的值:x1 = (b1 - a12x2 - a13x3) / a11这样,我们就可以使用三角分解法求解方程组了。
三角分解法解线性方程组#include<iostream.h>#include<iomanip.h>#include<stdlib.h>//----------------------------------------------全局变量定义区 const int Number=15; //方程最大个数doublea[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number]; // 系数行列式int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...}; int lenth,copy_lenth;//方程的个数char * x; //未知量a,b,c的载体int i,j;//----------------------------------------------函数声明区 voidinput(); //输入方程组void print_menu(); //打印主菜单int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式>0,若是,调整为顺序主子式全>0void xiaoqu_u_l(); //将行列式Doolittle分解 void calculate_u_l(); //计算Doolittle结果 void exchange(int m,int i); //交换A_y[m],A_y[i] void exchange_lie(int j); //交换a[][j]与b[]; void exchange_hang(int m,int n);//分别交换a[][]和b[]中的m与n两行 void exchange_a_lie(int m,int n); //交换a[][]中的m和n列 void exchange_x(int m,int n); //交换x[]中的x[m]和x[n] //函数定义区void print_menu(){system("cls");cout<<"------------方程系数和常数矩阵表示如下:\n"; for(intj=0;j<lenth;j++)cout<<"系数"<<j+1<<" ";cout<<"\t常数";cout<<endl;for(int i=0;i<lenth;i++){for(j=0;j<lenth;j++)cout<<setw(8)<<setiosflags(ios::left)<<a[i][j];cout<<"\t"<<b[i]<<endl; }}void input(){int i,j;cout<<"方程的个数:";cin>>lenth;if(lenth>Number){cout<<"It is too big.\n";return;}x=new char[lenth];for(i=0;i<lenth;i++)x[i]='a'+i;//输入方程矩阵//提示如何输入cout<<"====================================================\n";cout<<"请在每个方程里输入"<<lenth<<"系数和一个常数:\n"; //输入每个方程for(i=0;i<lenth;i++){cout<<"输入方程"<<i+1<<":";for(j=0;j<lenth;j++)cin>>a[i][j];cin>>b[i];}}void Doolittle() //Doolittle消去法计算方程组 {double temp_a[Number][Number],temp_b[Number];int i,j,flag;for(i=0;i<lenth;i++)for(j=0;j<lenth;j++)temp_a[i][j]=a[i][j]; flag=Doolittle_check(temp_a,temp_b);if(flag==0) cout<<"\n行列式为零.无法用Doolittle求解."; xiaoqu_u_l();calculate_u_l();cout<<"用Doolittle方法求得结果如下:\n";for(i=0;i<lenth;i++) //输出结果{for(j=0;x[j]!='a'+i&&j<lenth;j++);cout<<x[j]<<"="<<b[j]<<endl;}}void calculate_u_l() //计算Doolittle结果{ int i,j;double sum_ax=0; for(i=0;i<lenth;i++){for(j=0,sum_ax=0;j<i;j++)sum_ax+=a[i][j]*b[j];b[i]=b[i]-sum_ax;}for(i=lenth-1;i>=0;i--){for(j=i+1,sum_ax=0;j<lenth;j++)sum_ax+=a[i][j]*b[j];b[i]=(b[i]-sum_ax)/a[i][i]; }}void xiaoqu_u_l() //将行列式按Doolittle分解{ int i,j,n,k;double temp; for(i=1,j=0;i<lenth;i++)a[i][j]=a[i][j]/a[0][0]; for(n=1;n<lenth;n++){ //求第n+1层的上三角矩阵部分即Ufor(j=n;j<lenth;j++){ for(k=0,temp=0;k<n;k++)temp+=a[n][k]*a[k][j];a[n][j]-=temp;}for(i=n+1;i<lenth;i++) //求第n+1层的下三角矩阵部分即L{ for(k=0,temp=0;k<n;k++)temp+=a[i][k]*a[k][n];a[i][n]=(a[i][n]-temp)/a[n][n];}}}int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零{int i,j,k,maxi;double lik,temp;for(k=0;k<lenth-1;k++){j=k;for(maxi=i=k;i<lenth;i++)if(temp_a[i][j]>temp_a[maxi][j]) maxi=i;if(maxi!=k){ exchange_hang(k,maxi);for(j=0;j<lenth;j++){ temp=temp_a[k][j];temp_a[k][j]=temp_a[maxi][j];temp_a[maxi][j]=temp;}}for(i=k+1;i<lenth;i++){lik=temp_a[i][k]/temp_a[k][k];for(j=k;j<lenth;j++)temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;temp_b[i]=temp_b[i]-temp_b[k]*lik;}}if(temp_a[lenth-1][lenth-1]==0) return 0;return 1;}void exchange_hang(int m,int n) //交换a[][]中和b[]两行 { int j; double temp;for(j=0;j<lenth;j++){ temp=a[m][j];a[m][j]=a[n][j];a[n][j]=temp;}temp=b[m];b[m]=b[n];b[n]=temp;}void exchange(int m,int i) //交换A_y[m],A_y[i] { int temp;temp=A_y[m];A_y[m]=A_y[i];A_y[i]=temp;}void exchange_lie(int j) //交换未知量b[]和第i列 { double temp;int i; for(i=0;i<lenth;i++){ temp=a[i][j];a[i][j]=b[i];b[i]=temp;}}void exchange_a_lie(int m,int n) //交换a[]中的两列{ double temp;int i; for(i=0;i<lenth;i++) { temp=a[i][m];a[i][m]=a[i][n];a[i][n]=temp;}}void exchange_x(int m,int n) //交换未知量x[m]与x[n] { char temp;temp=x[m];x[m]=x[n];x[n]=temp;}//主函数void main(){int flag=1;input(); //输入方程while(flag){print_menu(); //打印主菜单cout<<"用Doolittle方法求得结果如下:\n";for(i=0;i<lenth;i++) //输出结果{for(j=0;x[j]!='a'+i&&j<lenth;j++);cout<<x[j]<<"="<<b[j]<<endl;}}}。