Crout 方法解线性方程组的程序设计
制作人:李超(小),李超(大),黄黎越,李海燕,黄芳
任务分工:李海燕 ,黄黎越,求出分解矩阵L与U并输出
李超(小),李超(大),x与y的求解输出,算法的设计编写
黄芳:程序中系数矩阵a与方程组y的输入与输出 共同完成流程图和注释语句的编写
Crout 方法解线性方程组的算法
给定线性方程组AX = b ,其中系数矩阵A = (aij) n×n 非奇异,x=(x1 ,x2 ,…, x n)T ,b =( b1,b2,…bn)T , 用 Crout 方法解AX=b的算法如下:
(1) 对A 作LU 分解
由A = LU及矩阵的乘法原理可得: Lij = aij -
?LikUki , j = 1, 2 , …, i, i=1,2,…n;
k?1j?1Uij = ( aij -
?LikUki) / Lii , j = i + 1, i + 2 , …, n,i=1,2,…n;
k?1i?1(2)解两个三角型方程组
由A = LU 及AX = b 可得L (UX) = b ,令 Y = ( y 1 , y 2 , …, y n) T = UX ,则L Y = b ,于是求解AX = b 就被化为求解下三角型方程组L Y = b 及单位上三角型方程组UX = Y . a) 先解下三角型方程LY=b由 l11y1=b1, l21y1+l22y2=b2l11, ……
ln1y1+ln2y2+…+lnnyn=bn ∴yi=b1/l11, i=1
yi=( bi-?LikYk)/lii, i=2,3,…,n
k?1i?1b)再解单位上三角型方程组UX=Y 由UX=Y得 x1+u12x2+…+u1nxn=y1 x2+…+u2nxn=y2 ……… xn-1+un-1nxn=yn-1 xn=yn
利用回代解法可得方程组AX=b的解为 xi=yn,i=n
xi=yi-?UikXk,i=n-1,…,2,1
k?i?1n
(3)程序为:
#include \
#include \头文件 #define N 20//自定义N=20 int main()//主函数 {
int i,j,k; int size;
float a[N][N],l[N][N],u[N][N]; float b[N],x[N],y[N];//定义变量
printf(\分解法解方程组\\n\ printf(\请输入方阵A的n:\ scanf(\ printf(\
printf(\请输入方程组的系数:\\n\ for(i=0;i scanf(\输入方程组系数矩阵a[][] } } printf(\请输入方程组的y:\\n\for(i=0;i printf(\方程组y为:\\n\for(i=0;i for(i=0;i for(i=0;i for(j=0;j l[0][0]=a[0][0]; for(i=1;i for(i=1;i for(k=0;k printf(\ for(j=i+1;j for(j=1;j printf(\ printf(\输出矩阵L[i][j]\\n\ for(i=0;i for(j=0;j printf(\ printf(\ \输出下三角矩阵l[][] } printf(\ } printf(\输出矩阵U[i][j]\\n\ for(i=0;i for(j=0;j printf(\ printf(\ \输出单位上三角矩阵u[][] } printf(\ } y[0]=b[0]/l[0][0];//给y[0]初始值 for(i=1;i y[i]=y[i]/l[i][i]; } printf(\ printf(\值:\\n\ for(i=0;i printf(\的值:\\n\ x[size-1]=y[size-1];//给x[size-1]赋值 for(i=size-2;i>=0;i--) { x[i]=y[i]; for(k=i+1;k for(i=0;i (4)流程图