用高斯列主元消元法解线性方程组
用列主元高斯消元法求线性代数方程组的解

课程设计任务书前 言回顾普通解方程组的方法,一般都是先逐个削去未知变量,最终得到只有一个未知变量的方程,解之,把得到的值回代到消去变量过程中得到的方程组,逐个求出未知变量。
这种解线性方程组的基本方法就是这里要介绍的高斯消去法。
数学上,高斯消元法(或译:高斯消去法),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。
当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。
高斯消元法可以用在电脑中来解决数千条等式及未知数。
高斯消元法可以用来找出一个可逆矩阵的逆矩阵。
用关联矩阵表述网络拓扑结构,并根据厂站拓扑结构和网络拓扑结构等概念简化了电力系统的拓扑结构。
根据广义乘法和广义加法的运算规则,将改进的高斯消元算法应用于电力系统拓扑结构分析中,并引入稀疏、分块处理等技术提高了上述拓扑分析的效率。
采用上述高斯消元算法对山东电网220kV 以上的变电站进行拓扑结构分析,结果表明了运用该高斯消元法进行网络拓扑分析的正确性和有效性。
用列主元素法,选取每列的绝对值最大的元素作为消去对象并作为主元素。
然后换行使之变到主元位子上,在进行消元计算。
设)()(k k b X A ,确定第k 列主元所在位置k i ,在交换k i 行和k 行后,在进行消元,并用MATLAB 软件进行求解。
目录摘要....................................................................................... 错误!未定义书签。
第1章绪论 ......................................................................... 错误!未定义书签。
第2章高斯消元法的算法描述 (2)2.1高斯消元法的原理概述 (2)c231730658" 2.1.1高斯消元法的消元过程 (2)c231730658" 2.1.2高斯消元法的回带过程 (3)c231730658" 2.1.3高斯消元法的复杂度分析 (4)c231730658" 2.2列主高斯消元法原理简介 (5)c231730658" 2.2.1列主高斯消元法的消元过程 (6)c231730658" 2.2.2列主高斯消元法的回带过程 (6)c231730658" 2.2.3列主高斯消元法的算法描述 (6)c231730662"第3章高斯消元法的物理应用 (9)3.1c231730663"电网模型的描述 (9)c231730658" 3.2电网模型的问题分析 (9)c231730658"3.3求解计算 (11)c231730693"参考文献 (13)摘 要用列主元素高斯消去法法,选取每列的绝对值最大的元素作为消去对象并作为主元素。
Gauss列主元素消去法实验

Lab06.Gauss 列主元素消去法实验【实验目的和要求】1.使学生深入理解并掌握Gauss 消去法和Gauss 列主元素消去法步骤; 2.通过对Gauss 消去法和Gauss 列主元素消去法的程序设计,以提高学生程序设计的能力;3.对具体问题,分别用Gauss 消去法和Gauss 列主元素消去法求解。
通过对结果的分析比较,使学生感受Gauss 列主元素消去法优点。
【实验内容】1.根据Matlab 语言特点,描述Gauss 消去法和Gauss 列主元素消去法步骤。
2.编写用不选主元的直接三角分解法解线性方程组Ax=b 的M 文件。
要求输出Ax=b 中矩阵A 及向量b ,A=LU 分解的L 与U ,det A 及解向量x 。
3.编写用Gauss 列主元素消去法解线性方程组Ax=b 的M 文件。
要求输出Ax=b 中矩阵A 及向量b 、PA=LU 分解的L 与U 、det A 及解向量x ,交换顺序。
4.给定方程组(1) ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--11134.981.4987.023.116.427.199.103.601.3321x x x(2) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----15900001.582012151********.23107104321x x x x 先用编写的程序计算,再将(1)中的系数3.01改为3.00,0.987改为0.990;将(2)中的系数2.099999改为2.1,5.900001改为9.5,再用Gauss 列主元素消去法解,并将两次计算的结果进行比较。
【实验仪器与软件】1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ;2.Matlab 6.0及以上版本。
实验讲评:实验成绩:评阅教师:200 年 月 日Lab06.Gauss 列主元素消去法实验第一题:1、算法描述:Ⅰ、Gauss 消去法由书上定理5可知 设Ax=b ,其中A ∈R^(n(1)如果()0(1,2,....,1)k kka k n ≠=-,则可通过高斯消去法将Ax=b 约化为等价的 角形线性方程组,且计算公式为:① 消元计算(k=1,2,….,n-1)()()(1)()()(1)()()/,1,...,,,,1,...,,,1,...,.k k ik ik kk k k k ij ij ik kj k k k iiik k m a a i k n a a m a i j k n b b m b i k n ++==+=-=+=-=+② 回带公式()()()()()1/,()/,1,...,2,1.n n n n nn ni i i i iii j ii j i x b a x ba x a i n =+==-=-∑(2)如果A 为非奇异矩阵,则可通过高斯消去法将方程组Ax=b 约化方程组为上三角矩阵以上消元和回代过程总的乘除法次数为332333nn nn +-≈,加减法次数为32353263nnn n+-≈以上过程就叫高斯消去法。
数值分析计算方法实验报告

end;
end;
X=x;
disp('迭代结果:');
X
format short;
输出结果:
因为不收敛,故出现上述情况。
4.超松弛迭代法:
%SOR法求解实验1
%w=1.45
%方程组系数矩阵
clc;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
b=[10,5,-2,7]'
b=[10,5,-2,7]'
[m,n]=size(A);
if m~=n
error('矩阵A的行数和列数必须相同');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同');
return;
end
if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
3.实验环境及实验文件存档名
写出实验环境及实验文件存档名
4.实验结果及分析
输出计算结果,结果分析和小结等。
解:1.高斯列主元消去法:
%用高斯列主元消去法解实验1
%高斯列主元消元法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在x变量中
format long;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
return;
end
c=n+1;
A(:,c)=b;
for k=1:n-1
数值计算方法复习题

fuxiti例1证明方程1-x-sin x=0在区间[0,1]内有一个根,使用二分法求误差不超过0.5×10-4的根要迭代多少次?证明令f(x)=1-x-sin x,∵f(0)=1>0,f(1)=-sin1<0∴f(x)=1-x-sin x=0在[0,1]有根.又f'(x)=1-c os x>0(x∈[0.1]),故f(x)=0在区间[0,1]内有唯一实根.给定误差限ε=0.5×10-4,有只要取n=14.例4选择填空题1. 设函数f(x)在区间[a,b]上连续,若满足,则方程f(x)=0在区间[a,b]一定有实根.答案:f(a)f(b)<0解答:因为f(x)在区间[a,b]上连续,在两端点函数值异号,由连续函数的介值定理,必存在c,使得f(c)=0,故f(x)=0一定有根.2. 用简单迭代法求方程f(x)=0的实根,把方程(x)=0表成x=ϕ(x),则f(x)=0的根是( )(A)y=x与y=ϕ(x)的交点(B) y=x与y=ϕ(x)交点的横坐标(C) y=x与x轴的交点的横坐标(D) y=ϕ(x)与x轴交点的横坐标答案:(B)解答:把f(x)=0表成x=ϕ(x), 满足x=ϕ(x)的x是方程的解,它正是y=x与y=ϕ(x)的交点的横坐标.3.为求方程x3―x2―1=0在区间[1.3,1.6]内的一个根,把方程改写成下列形式,并建立相应的迭代公式,迭代公式不收敛的是( )(A)(B)(C)(D)答案:(A)解答:在(A)中故迭代发散.在(B)中,故迭代收敛.在(C)中,,故迭代收敛.在(D)中,类似证明,迭代收敛.例3填空选择题:1. 用高斯列主元消去法解线性方程组作第1次消元后的第2,3个方程分别为。
解答1. 选a21=2为主元,作行互换,第1个方程变为:2x1+2x2+3x3=3,消元得到是应填写的内容。
一、解答下列问题:1) 数值计算中,最基础的五个误差概念(术语)是 , , , , .2) 分别用 2.718281, 2.718282 作数e 的近似值 ,它们的有效位数分别有位, 位; 又取73.13≈ (三位有效数字),则≤-73.13 .3)为减少乘除法运算次数,应将算式32)1(7)1(51318---+-+=x x x y 改写成4)为减少舍入误差的影响,应将算式 9910- 改写成 5)递推公式 ⎪⎩⎪⎨⎧=-==-,2,1,110210n y y y n n如果取41.120≈=y 作计算,则计算到10y 时,误差有这个计算公式数值稳定不稳定 ?1) 绝对误差 , 相对误差 , 有效数字 , 截断误差 , 舍入误差 。
列主元高斯消去法和列主元三角分解法解线性方程

计算方法实验报告1课题名称用列主元高斯消去法和列主元三角分解法解线性方程目的和意义高斯消去法是一个古老的求解线性方程组的方法,但由它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法;用高斯消去法解线性方程组的基本思想时用矩阵行的初等变换将系数矩阵A 约化为具有简单形式的矩阵上三角矩阵、单位矩阵等,而三角形方程组则可以直接回带求解 用高斯消去法解线性方程组b Ax =其中A ∈Rn ×n 的计算量为:乘除法运算步骤为32(1)(1)(21)(1)(1)262233n n n n n n n n n n nMD n ----+=+++=+-,加减运算步骤为(1)(21)(1)(1)(1)(25)6226n n n n n n n n n n AS -----+=++=;相比之下,传统的克莱姆法则则较为繁琐,如求解20阶线性方程组,克莱姆法则大约要19510⨯次乘法,而用高斯消去法只需要3060次乘除法;在高斯消去法运算的过程中,如果出现absAi,i 等于零或过小的情况,则会导致矩阵元素数量级严重增长和舍入误差的扩散,使得最后的计算结果不可靠,所以目前计算机上常用的解低阶稠密矩阵方程的快速有效的方法时列主元高斯消去法,从而使计算结果更加精确; 2、列主元三角分解法高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A=LU,并求解Ly=b 的过程;回带过程就是求解上三角方程组Ux=y;所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法采用选主元的方式与列主元高斯消去法一样,也是为了避免除数过小,从而保证了计算的精确度计算公式1、 列主元高斯消去法设有线性方程组Ax=b,其中设A 为非奇异矩阵;方程组的增广矩阵为第1步k=1:首先在A 的第一列中选取绝对值最大的元素1l a ,作为第一步的主元素:111211212222112[,]n n n l n nn n a a a a b a a a b a a a b ⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦a b然后交换A,b 的第1行与第l 行元素,再进行消元计算;设列主元素消去法已经完成第1步到第k -1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组 Akx=bk第k 步计算如下:对于k=1,2,…,n -11按列选主元:即确定t 使 2如果t ≠k,则交换A,b 第t 行与第k 行元素; 3消元计算消元乘数mik 满足:4回代求解2、 列主元三角分解法 对方程组的增广矩阵 经过k -1步分解后,可变成如下形式:111max 0l i i n a a ≤≤=≠(1)(1)(1)(1)(1)1112111(2)(2)(2)(2)22222()(()1)()()()()()1,1()(,)()[,][,] k k k k nk k nk n k k k k k kk kn k k k k n k k k n nn a a a a b a a a b a a b a b b a a a +++⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥→=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦A b A b ()()max 0k k tk ik k i na a ≤≤=≠,(1,,)ik ik ik kka a m i k n a ←=-=+, (,1,,), (1,,)ij ij ik kji i ik k a a m a i j k n b b m b i k n ←+=+⎧⎨←+=+⎩⎪⎪⎩⎪⎪⎨⎧--=-←←∑+=)1,,2,1(,)(1n n i a x a b x a b x ii n i j j ij i i nnn n [,]A A b =11121,11111222,122221,11,1,1,211,11,2121,112,112,1k k k k k k k j n k k j n k k k i i i k n n kk kj kn k ik ij in i nknjk k k j k n n nnk k n a a a b A a u u u u u u y l l l l l l ll l l l u u u u u y u u u u y a a b a a b l a -------------⎡→⎣⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎦第k 步分解,为了避免用绝对值很小的数kku 作除数,引进量1111 (,1,,;1,2,,) ()/ (1,2,,;1,2,,)k kj kj km mj m k ik ik im mk kkm u a l u j k k n k n l a l u u i k k n k n -=-=⎧=-=+=⎪⎪⎨⎪=-=++=⎪⎩∑∑11(,1,,)k i ik im mk m s a l u i k k n -==-=+∑,于是有kk u =ks ;如果 ,则将矩阵的第t 行与第k 行元素互换,将i,j 位置的新元素仍记为jjl 或jja ,然后再做第k 步分解,这时列主元高斯消去法程序流程图max t ik i n s s ≤≤= ()/ 1,2,,)1 (1,2,,),kk k k t iki k ik u s s s l s s i k k n l i k k n ===++≤=++即交换前的,(且列主元高斯消去法Matlab主程序function x=gauss1A,b,c %列主元法高斯消去法解线性方程Ax=bif lengthA~=lengthb %判断输入的方程组是否有误disp'输入方程有误'return;enddisp'原方程为AX=b:' %显示方程组Abdisp'------------------------'n=lengthA;for k=1:n-1 %找列主元p,q=maxabsAk:n,k; %找出第k列中的最大值,其下标为p,qq=q+k-1; %q在Ak:n,k中的行号转换为在A中的行号if absp<cdisp'列元素太小,detA≈0';break;elseif q>ktemp1=Ak,:; %列主元所在行不是当前行,将当前行与列主Ak,:=Aq,:; 元所在行交换包括bAq,:=temp1;temp2=bk,:;bk,:=bq,:;bq,:=temp2;end%消元for i=k+1:nmi,k=Ai,k/Ak,k; %Ak,k将Ai,k消为0所乘系数Ai,k:n=Ai,k:n-mi,kAk,k:n; %第i行消元处理bi=bi-mi,kbk; %b消元处理endenddisp'消元后所得到的上三角阵是'A %显示消元后的系数矩阵bn=bn/An,n; %回代求解for i=n-1:-1:1bi=bi-sumAi,i+1:nbi+1:n/Ai,i;endclear x;disp'AX=b的解x是' x=b;调用函数解题列主元三角分解法程序流程图列主元三角分解法Matlab主程序①自己编的程序:function x=PLUA,b,eps %定义函数列主元三角分解法函数if lengthA~=lengthb %判断输入的方程组是否有误disp'输入方程有误'return;enddisp'原方程为AX=b:' %显示方程组Abdisp'------------------------'n=lengthA;A=A b; %将A与b合并,得到增广矩阵for r=1:nif r==1for i=1:nc d=maxabsA:,1; %选取最大列向量,并做行交换if c<=eps %最大值小于e,主元太小,程序结束break;elseendd=d+1-1;p=A1,:;A1,:=Ad,:;Ad,:=p;A1,i=A1,i;endA1,2:n=A1,2:n;A2:n,1=A2:n,1/A1,1; %求u1,ielseur,r=Ar,r-Ar,1:r-1A1:r-1,r; %按照方程求取ur,iif absur,r<=eps %如果ur,r小于e,则交换行p=Ar,:;Ar,:=Ar+1,:;Ar+1,:=p;elseendfor i=r:nAr,i=Ar,i-Ar,1:r-1A1:r-1,i; %根据公式求解,并把结果存在矩阵A中endfor i=r+1:nAi,r=Ai,r-Ai,1:r-1A1:r-1,r/Ar,r; %根据公式求解,并把结果存在矩阵A中endendendy1=A1,n+1;for i=2:nh=0;for k=1:i-1h=h+Ai,kyk;endyi=Ai,n+1-h; %根据公式求解yiendxn=yn/An,n;for i=n-1:-1:1h=0;for k=i+1:nh=h+Ai,kxk;endxi=yi-h/Ai,i; %根据公式求解xiendAdisp'AX=b的解x是'x=x'; %输出方程的解②可直接得到P,L,U并解出方程解的的程序查阅资料得子函数PLU1,其作用是将矩阵A分解成L乘以U的形式;PLU2为调用PLU1解题的程序,是自己编的Ⅰ.function l,u,p=PLU1A %定义子函数,其功能为列主元三角分解系数矩阵A m,n=sizeA; %判断系数矩阵是否为方阵if m~=nerror'矩阵不是方阵'returnendif detA==0 %判断系数矩阵能否被三角分解error'矩阵不能被三角分解'endu=A;p=eyem;l=eyem; %将系数矩阵三角分解,分别求出P,L,Ufor i=1:mfor j=i:mtj=uj,i;for k=1:i-1tj=tj-uj,kuk,i;endenda=i;b=absti;for j=i+1:mif b<abstjb=abstj;a=j;endendif a~=ifor j=1:mc=ui,j;ui,j=ua,j;ua,j=c;endfor j=1:mc=pi,j;pi,j=pa,j;pa,j=c;endc=ta;ta=ti;ti=c;endui,i=ti;for j=i+1:muj,i=tj/ti;endfor j=i+1:mfor k=1:i-1ui,j=ui,j-ui,kuk,j;endendendl=trilu,-1+eyem;u=triuu,0Ⅱ.function x=PLU2A,b %定义列主元三角分解法的函数l,u,p=PLU1A %调用PLU分解系数矩阵A m=lengthA; %由于A左乘p,故b也要左乘p v=b;for q=1:mbq=sumpq,1:mv1:m,1;endb1=b1 %求解方程Ly=b for i=2:1:mbi=bi-sumli,1:i-1b1:i-1;endbm=bm/um,m; %求解方程Ux=y for i=m-1:-1:1bi=bi-sumui,i+1:mbi+1:m/ui,i;endclear x;disp'AX=b的解x是' x=b;调用函数解题①②编程疑难这是第一次用matlab编程,对matlab的语句还不是非常熟悉,因此在编程过程中,出现了许多错误提示;并且此次编程的两种方法对矩阵的运算也比较复杂;问题主要集中在循环控制中,循环次数多了一次或者缺少了一次,导致数据错误,一些基本的编程语句在语法上也会由于生疏而产生许多问题,但是语句的错误由于系统会提示,比较容易进行修改,数据计算过程中的一些逻辑错误,比如循环变量的控制,这些系统不会提示错误,需要我们细心去发现错误,不断修正,调试;。
高斯列主元消元法解线性方程组

高斯列主元消元法解线性方程组一、题目:用Gauss 列主元消去法解线性方程组Ax b =,其中,A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.000 2.000 3.000 4.500 5.000 21.803⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭ 0.230 -52.322 54.000 240.236 29.304 -117.818b ⎛⎫ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭T X=(0.907099 -1.961798 3.293738 -4.500708 3.029344 -5.255068)二、原理及步骤分析设nn ij R a A ⨯∈=][)1(,nn Rb b b b ∈=],,,[)1()2(2)1(1 。
若约化主元素),,2,1(0)(n k a k kk =≠,则通过高斯消元法将方程b AX =约化为三角形方程组求解。
如果在消元过程中发现某个约化主元0)(=k kk a , 则第K 次消元就无法进行。
此外,即使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,因为计算过程中存在舍入误差。
为减少计算过程中的舍入误差对解的影响,在每次消元前,应先选择绝对值尽可能大的元作为约元的主元,如果在子块的第一列中选取主元,则相应方法称为列主元消元法。
相应过程为:(1)选主元:在子块的第一列中选择一个元)(k k i k a 使)(max k ik ni k kk i a a k ≤≤=并将第k 行元与第k i 行元互换。
数值计算方法复习题

fuxiti例1证明方程1-x-sin x=0在区间[0,1]内有一个根,使用二分法求误差不超过0.5×10-4的根要迭代多少次?证明令f(x)=1-x-sin x,∵f(0)=1>0,f(1)=-sin1<0∴f(x)=1-x-sin x=0在[0,1]有根.又f'(x)=1-c os x>0(x∈[0.1]),故f(x)=0在区间[0,1]内有唯一实根.给定误差限ε=0.5×10-4,有只要取n=14.例4选择填空题1. 设函数f(x)在区间[a,b]上连续,若满足,则方程f(x)=0在区间[a,b]一定有实根.答案:f(a)f(b)<0解答:因为f(x)在区间[a,b]上连续,在两端点函数值异号,由连续函数的介值定理,必存在c,使得f(c)=0,故f(x)=0一定有根.2. 用简单迭代法求方程f(x)=0的实根,把方程(x)=0表成x=ϕ(x),则f(x)=0的根是( )(A)y=x与y=ϕ(x)的交点(B) y=x与y=ϕ(x)交点的横坐标(C) y=x与x轴的交点的横坐标(D) y=ϕ(x)与x轴交点的横坐标答案:(B)解答:把f(x)=0表成x=ϕ(x), 满足x=ϕ(x)的x是方程的解,它正是y=x与y=ϕ(x)的交点的横坐标.3.为求方程x3―x2―1=0在区间[1.3,1.6]内的一个根,把方程改写成下列形式,并建立相应的迭代公式,迭代公式不收敛的是( )(A)(B)(C)(D)答案:(A)解答:在(A)中故迭代发散.在(B)中,故迭代收敛.在(C)中,,故迭代收敛.在(D)中,类似证明,迭代收敛.例3填空选择题:1. 用高斯列主元消去法解线性方程组作第1次消元后的第2,3个方程分别为。
解答1. 选a21=2为主元,作行互换,第1个方程变为:2x1+2x2+3x3=3,消元得到是应填写的内容。
一、解答下列问题:1) 数值计算中,最基础的五个误差概念(术语)是 , , , , .2) 分别用 2.718281, 2.718282 作数e 的近似值 ,它们的有效位数分别有位, 位; 又取73.13≈ (三位有效数字),则≤-73.13 .3)为减少乘除法运算次数,应将算式32)1(7)1(51318---+-+=x x x y 改写成4)为减少舍入误差的影响,应将算式 9910- 改写成 5)递推公式 ⎪⎩⎪⎨⎧=-==-,2,1,110210n y y y n n如果取41.120≈=y 作计算,则计算到10y 时,误差有这个计算公式数值稳定不稳定 ?1) 绝对误差 , 相对误差 , 有效数字 , 截断误差 , 舍入误差 。
用高斯列主元消元法解线性方程分析解析

沈阳航空工业学院课程设计学号2008040201105班级84020103姓名李荣飞指导教师尹航2009年9月11日沈阳航空工业学院课程设计任务书电子信息工程学院电子信息工程专业84020103班学号2008040201105一、课程设计题目:用高斯列主元消元法解线性方程二、课程设计工作自2009年9月6日起至2009年9月11日止三、课程设计内容:运用所学的C语言知识,编制和调试程序,拥有以下功能:请用高斯列主元消元法解以下方程组:2x12x25x3 53x14x27x3 6x13x23x3 5四、课程设计要求:程序质量:贯彻构造化程序设计思想。
用户界面友善,功能明确,操作方便;能够加以其余功能或修饰。
用户界面中的菜单起码应包含“输入数据”、“开始计算”、“退出”3项。
代码应适合缩进,并给出必需的说明,以加强程序的可读性。
课程设计说明书:课程结束后,上交课程设计说明书(打印稿和电子稿),其内容以下:封面课程设计任务书目录需求剖析(剖析题目的要求)程序流程图(整体流程图和主要功能模块流程图)中心技术的实现说明及相应程序段个人总结参照资料源程序及适合的说明指导教师:________学生署名:________目录一、需求剖析1二、程序流程图2三、中心技术的实现说明及相应程序段8四、个人总结11五、参照文件11六、源程序 (11)沈阳航院设计用纸一、需求剖析经过对程序设计题目的剖析可知,整个程序的设计实现大概分为三个模块,分别是:输入方程组,计算方程组,持续运算/退出。
计算方程组模块对应三个函数,其函数名和功能以下:一、互换行的距函数(huanhang):主要实现线性代数高斯列主元消元法求解线性方程组中的初等行变换。
二、比较系数大小的函数(bijiao):实现比较系数大小的算法。
三、实现菜单项选择择的函数(caidan):使用户界面友善,操作方便。
除上边介绍的功能以外,程序还拥有“持续运算/退出”功能,能够在程序的一次运转中间循环履行全部的功能,并依据需要,停止程序的履行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=mymax(k);
if(ark==0)/*判断线性方程组是否合法*/
{
printf("\n\n此方程组无解!");message();
}
else if(f!=k)
change(f,k);
按照解题的思路,整个程序大概由以下几个部分组成:输入方程组;判断线性方程组是否合法;交换行的矩函数(change);比较系数大小的函数(mymax);菜单的选择(message);开始计算;退出程序等。除了以上主要部分外,程序还用到了if.和switch选择语句,对程序的进一步简化起到重要作用,使源程序显的更加简洁明了。
三、课程设计要求
1.程序质量:
贯彻结构化的程序设计思想。
用户界面友好,功能明确,操作方便。
用户界面中的菜单至少应包括“输入数据”、“开始计算”、“退出”3项。
代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。课程设计说明书的格式和内容参见提供的模板。
int r,k,i,j;
char celect;
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.开始解方程组请按Enter.");
printf("\n\n2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
#define Esc 0x1b
#define Enter 0x0d
float A[number][number+1] ,ark;
int f,n;
change(int r,int k);
float mymax(int m);
message();
main()
{
float x[number];/*定义数组X[]用于储存方程组的解*/
}
message();
}
change(int r,int k)/*交换行的函数*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
六、参考文献
1 谭浩强.C程序设计.北京:清华大学出版社,2005
2 刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006
七、源程序
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define number 40/*宏定义(若线性方程组的维数大可以把number定义的值更大些)*/
1、此模块通过change()函数改变矩阵行的顺序,具体程序段如下:
change(int r,int k) /*交换行的矩函数*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
二、需求分析
方法说明(以4阶为例):
第1步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式:
第2步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:
{
float p1=0;
for(j=k+1;j<=n;j++)
{
p1=p1+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-p1)/A[k][k];
/*对线性方程组求解的运算(依次求的前面的、未知树的解)*/
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
第3步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:
按x4x3x2x1的顺序回代求解出方程组的解
附:下面三种变换称为初等行变换:
1对调两行;
2以数k≠0乘某一行中的所有元素;
3把某一行所有元素的k倍加到另一行对应的元素上去。
printf("\n\n请输入方程组维数:n=");
scanf("%d",&n);
printf(" \n\n现在输入方程组系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
/*把线性方程的系数复于数组中*/
{
printf("\n\n继续运算按Enter ,退出程式按Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的输入!");message();}
}
}
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
/*此过程是对数组进行初等行变换*/
}
x[n]=A[n][n+1]/A[n][n];/*先求出最后一个未知数的解*/
for( k=n-1;k>=1;k--)
A[k][i]=A[0][i];}
2、此模块通过mymax()函数实现矩阵行的升序排列,具体程序段如下:
float mymax(int m) /*比校系数大小的函数*/
{
int i;
floatp2=0;
for(i=m;i<=n;i++)
if(fabs(A[i][m])>p2)
{
P2=fabs(A[i][m]);
三、程序流程图
总体流程图(一)
变换行的函数流程图(二)
判断系数大小的流程图(三)
实现菜单选择的流程图(四)
程序运行结果如图:
(图一)
(图二)
若线性方程组为四维方程时:
(图三)
四、核心技术的实现方法及程序段
源程序主要由三个自定义函数和一个主函数组成,其中主函
数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数中交换行的距函数、比较系数大小的函数和实现菜单选择的函数是程序中较为核心的部分,下面分别进行说明:
四、指导教师和学生签字
指导教师:________学生签名:________
五、成绩:
六、教师评语:
一、程序设计题目1
二、需求分析(高斯列主元消元法)1
三、程序流程图3
四、核心技术的实现方法及程序段6
五、个人总结8
六、参考文献9
七、源程序9
一、程序设计题目
用C语言编写软件完成以下任务:
请用高斯列主元消元法解下列线性方程组:
沈阳航空工业学院
课程设计
班级:6402104班
学号:1139
姓名:郑松
指导教师:刘成
07年9月14日
课程设计任务书
院系:电子 专业:电子信息工程 班级:6402104
学号:
一、课程设计时间
2007年9月10日至2007年9月14日,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
请用高斯列主元消元法解下列线性方程组:
}
float mymax(int m)/*比较系数大小的函数*/
{
int i;
float p2=0;
for(i=m;i<=n;i++)
if(fabs(A[i][m])>p2)
/*对数组中的元素进行取绝对值比较大小的运算*/
{
p2=fabs(A[i][m]);
f=i;
}
return p2;
}
message()/*菜单选择的函数*/
f=i;
}
returnp2;
}
3、模块通过message函数实现程序的重新运算,否则退出,错误则不执行,至此程序完毕,具体程序段如下:
message() /*实现菜单选择的函数*/
{
printf("\n\n继续运算按Enter ,退出程式按Esc!");
switch(getch())
{
case Enter: main();