线性方程组AX=B的数值解法课件
- 格式:ppt
- 大小:1.08 MB
- 文档页数:22
数学-线性代数导论-#9Ax=b的解:存在性、解法、解的结构、解的数量线性代数导论 - #9 Ax=b的解:存在性、解法、解的结构、解的数量终于,我们在b为参数的⼀般情况下,开始分析Ax=b的解,包括标题中的四个⽅⾯。
⾸先是解的存在性。
从⼏何上说,当且仅当向量b位于列空间C(A)内时,Ax=b有解;从代数上说,不能出现类似于“⾮0数=0”的⽭盾⽅程:1.这为我们判定是否有解提供了⼀个简便的途径:根据Gauss消元法中对A和b进⾏⾏变换的同步性,⾏的相同线性组合的值⼀定相同。
所以假如A中各⾏可以通过简单的线性组合得到零⾏,⽽b进⾏相同线性组合的结果⾮0,则该⽅程组⼀定⽆解。
2.这为我们⾯对b为参数的⼀般情况进⾏的分类讨论提供了依据:当我们使⽤Gauss消元法得到A中的零⾏时,回代前应该针对零⾏所对应的新b值是否为0进⾏分类讨论。
其次是解法、解的结构和解的数量,这⾥要求我们运⽤之前解Ax=0时的知识。
解法和解Ax=0⼤致相同。
使⽤Guass消元法,确定主元,进⼀步确定主元变量和⾃由变量。
1.求出特解X p:置全部⾃由变量为0(简化运算),回代解出主元变量,得到Ax=b的⼀个解;2.解出Ax=0的全部解X N:也即基向量的全部线性组合,含有1或2个常数c;3.通解X=X p+X N:因为A(Xp+X N)=AX p+AX N=b+0=b,这也就是所谓“解的结构”,通解由⼀个特解和零空间内的全部向量组成。
从⼏何上说,解空间由零空间平移得到。
但是,这种⽅法存在缺陷,不通⽤。
问题就出在第⼀步。
如果没有⾃由变量怎么办?那后续的⽅法如何进⾏?解的结构还是那两个部分吗?还有,如果根本就没有解,怎么办?为了确定解的存在性;为了确定⾃由变量的个数,发掘其与解的数量及与之相对应的结构的关系,我们需要研究秩的概念。
之前已经提及,秩r=主元数。
如何利⽤r判定⼀个由m*n矩阵A构成的⽅程Ax=b的解的数量呢?关键是:1.⾃由变量的个数n-r(主元不同列),即r与n的相对关系;2.零⾏(可能出现“⾮0数=0”的⽭盾情况)的个数m-r(主元不同⾏以及主元⾮0),即r与m的相对关系;综合考虑,只可能出现以下四种情况(根据主元选取规则,r显然⼩于等于m和n):1.r=m=n(”满秩”),⼀定有唯⼀解:(1)没有零⾏,⼀定有解;(2)没有⾃由变量,解唯⼀(回代之后解出)。
线性方程组AX=B的数值计算方法实验学号:姓名:梁哲豪一、实验描述在自然科学和工程技术中很多问题的解决常常归结为解线性代数方程组。
例如电学中的网络问题,船体数学放样中建立三次样条函数问题,用最小二乘法求实验数据的曲线拟合问题,解非线性方程组问题,用差分法或者有限元法解常微分方程,偏微分方程边值问题等都导致求解线性方程组,而且后面几种情况常常归结为求解大型线性方程组。
线性代数方面的计算方法就是研究求解线性方程组的一些数值解法与研究计算矩阵的特征值及特征向量的数值方法。
关于线性方程组的数值解法一般有两类:直接法:若在计算过程中没有舍入误差,经过有限步算术运算,可求得方程组的精确解的方法。
迭代法:用某种极限过程去逐步逼近线性方程组精确解的方法。
迭代法具有占存储单元少,程序设计简单,原始系数矩阵在迭代过程中不变等优点,但存在收敛性及收敛速度等问题。
上三角线性方程组的求解:基本算法:高斯消元法:将原方程组化为三角形方阵的方程组:(k=1,2,…,n-1; i=k+1,k+2, …,n ;j=k+1,k+2, …,n+1)由回代过程求得原方程组的解:LU分解法:将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x。
二、实验内容1、许多科学应用包含的矩阵带有很多零。
在实际情况中很重要的三角形线性方程组有如下形式:……构造一个程序求解三角形线性方程组。
可假定不需要变换。
而且可用第k 行消去第k+1行的x。
k核心代码:#include<iostream.h>#include<math.h>#include<iomanip.h>#define N 4//矩阵阶数void ColPivot(double c[N][N+1],double[]);//函数声明void main(){int i,j;double x[N];double c[N][N+1]={1,3,5,7,1,2,-1,3,5,2,0,0,2,5,3,-2,-6,-3,1,4};cout<<"----------------------------------------"<<endl;cout<<"系数矩阵为: \n";for(i=0;i<N;i++){for(j=0;j<N;j++)cout<<setw(10)<<c[i][j];cout<<endl;}cout<<"右侧矩阵 y 为: \n";for(i=0;i<N;i++)cout<<setw(10)<<c[i][N];cout<<endl;cout<<"----------------------------------------"<<endl;ColPivot(c,x);//调用函数,进行高斯消去法变换cout<<"变换后得到的三角矩阵: \n";for(i=0;i<N;i++){for(j=0;j<N;j++)cout<<setw(10)<<c[i][j];cout<<endl;}cout<<"变换后的右侧矩阵 y 为: \n";for(i=0;i<N;i++)cout<<setw(10)<<c[i][N];cout<<endl;cout<<"----------------------------------------"<<endl; cout<<"方程的解为: \n";for(i=0;i<N;i++)cout<<" x["<<i<<"]= "<<x[i]<<endl;cout<<"----------------------------------------"<<endl; }void ColPivot(double c[N][N+1],double x[]){int i,j,k;double p,max;double t[N];for(i=0;i<=N-2;i++){max=0;k=i;for(j=i+1;j<N;j++)if(fabs(c[j][i])>max){k=j;max=fabs(c[j][i]);//选主元}if(k!=i)for(j=i;j<=N;j++){p=c[i][j];c[i][j]=c[k][j];//选出主元后进行交换c[k][j]=p;}for(j=i+1;j<N;j++){p=c[j][i]/c[i][i];for(k=i;k<=N;k++)c[j][k]-=p*c[i][k];//高斯消去,进行计算}}for(i=0;i<N;i++)t[i]=c[i][N];for(i=N-1;i>=0;i--)//利用回代法求最终解{for(j=N-1;j>i;j--)t[i]-=c[i][j]*x[j];x[i]=t[i]/c[i][i];}}运行结果:(以具体方程组为例)2、(PA=LU:带选主元的分解法)求解线性方程组AX=B,其中:A=B=核心代码:#include <stdio.h>#include <math.h>#define L 30double a[L][L],b[L],l[L][L],u[L][L],x[L],y[L];int main(){int n,i,j,k,r;printf("请输入矩阵元次:\n");scanf("%d",&n);printf("请输入矩阵各项:\n");for(i=1;i<=n;++i){for(j=1;j<=n;++j){scanf("%lf",&a[i][j]);}}printf("请输入方程组的常数项:\n");for(i=1;i<=n;++i){scanf("%lf",&b[i]);}for(i=1;i<=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k<=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r<k;++r){u[k][j]-=l[k][r]*u[r][j];}}for(i=k+1;i<=n;++i){l[i][k]=a[i][k];for(r=1;r<k;++r){l[i][k]-=l[i][r]*u[r][k];}l[i][k]/= u[k][k];}l[k][k]=1.0;}for(i=1;i<=n;++i){y[i]= b[i];for(j=1;j<i;++j){y[i]-=l[i][j]*y[j];}}for(i=n;i>0;--i){x[i]= y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/= u[i][i];}for(i=1;i<=n;++i){printf("%0.2lf\n",x[i]);}return0;}运行结果:3、使用程序3.3求解线性方程组AX=B,其中,A= [a ij] N×N= i j-1,而且B=[b ij] N×1, b11=N,当i≥2时,b i1=(i N-1)/(i-1),对N=3,7,11的情况分别求解。