第33卷 2013拉 第3期
5月 高师理科学刊
Joumal of Science of Teachers College and University Vo1.33 NO.3
Mav 20l3
文章编号:1007—9831(2013)03—0023—04
基于Matlab的Cramer法则求解线性方程组 张玉兰 (南京铁道职业技术学院社科部,江苏南京210015) 摘要:对文献[1】中的两个源程序进行了改进,使运算的速度和效率得到了有效的改进.以求解线 性方程组的Cramer法则法为基础,使用化为上三角形法求行列式,给出了算法流程图.在Maflab 语言环境下编写了一个通用的求解函数.最后通过两个具体的案例进行了验证,证实了所编写的 程序的正确性和稳定性. 关键词:线J}生方程组;Cramer法则;上三角形;Matlab 中图分类号:0151.2 文献标识码:A doi:10.39696.issn.1007—9831.2013.03.008
Solving linear equations based on the Maflab by Cramer rule ZHANG Yu-lan (Department ofSocialScienees,NamingInstitute ofRailwayTechnology,Nanjing210015,China) Abstract:Two soHrces in paper[1】was improved equally,thereby,efficaciously improving the velocity and efficiency of the mathematical operation.Based on Cramer rule law of solving linear equations,solved the determinant by transforming it to overhead triangle,and gave the flowchart of algorithm.Written a generic function in Maflab language environment.Finally,confirmed the correctness and the stability of the program by two specific cases. Key words:linear equations;Cramer rule;overhead triangle;Matlab
Cramer法则作为应用行列式求解线性方程组的一个经典方法历来受到众多学者的注意,当线性方程组 的阶数比较大的时候,求解的工作量也随之增大,为了提高使用Cramer法则求解线性方程组的运算速度和 准确性,可结合计算机来进行求解 .本文首先对文献[1】中的两个源程序进行了改进:将系数矩阵和把系 数矩阵中的第7列(.7=1,2,…,n,,l为线性方程组的阶数)的所有元素用方程组右端的常数项代替后 得到的所有矩阵分块放在一个矩阵b中,然后对矩阵b分块进行求解行列式,即将求解所有的行列式放在 一个循环中进行,简化了程序的编写,而且对具体的求解过程也作了细微的修改,并利用Cramer法则进行 求解线性方程组,其源程序记为gj1.1.m和 1.2.m.作了这一改进后,无需分别计算系数行列式和 D (J=1,2,…,,z)(D 是把系数行列式D中第.『歹 的元素用方程组右端的常数项代替后所得到的n阶行 列式),从而进一步提高了求解的速度和效率.其次,在利用Cramer法则求解线性方程组的过程中,使用 化上三角形法求解行列式,应用数学软件Matlab进行编程,给出了算法的流程图和源程序.
1文献[1]中的两个源程序的改进 functionqiujie=gj1.1(a)%gj1.1的函数; [n,m1]=size(a);
收稿日期:2012-01—10 作者简介:张玉兰(1982一),女,江苏盐城人,讲师,硕士,从事运筹学与控制论研究.E~mail:lanlan—njnumath@sohu.COIII 高师理科学刊 第33卷 b(1:n,l:ml一1)=a(1:n,l:ml一1);%将所有的矩 阵分块赋给同一个矩阵; b(1:n,ml:2*(ml一1))=【a(1:n,m1) 2:ml一1)】; fori=3:ml;b(1:n,(i-1)¥(ml一1)+1:i¥(ml一1))
=[a(1:n,1:i一2),a(1:n,m1),a(1:n,i:ml一1)】; end for l=l:ml;%使用库函数det求解行列式; al=b(1:n,(1-1)}(ml一1)+1:l十(ml~1)); d(1)=det(a1); end ifd(1)~=0; fori=2:ml; x(i一1):d(i)ld(1); end else x=口; end X function qiujie=gj1.2(a)o ̄gil.2的函数; 【n,m1]=size(a); b(1:n,l:ml一1)=a(1:n,l:ml一1);%将所有的矩 阵分块赋给同—个矩阵; b(1:n,ml:2*(m1—1))=【a(1:n,m1),a(1:n, 2:ml-1)】; fori=3:ml; b(1:n,(i-1)}(ml一1)+1:i}(m1—1))=【a(1:n, 1:i-2),a(1:n,m1),a(1:n,i:ml一1)]; end forp=l:ml; al=b(1:n,(p-1){(ml一1)+l:p (ml一1)); s=l; for kH1:n;%使用列主元一高斯消去法求解行列式; max=IEitbs(al(k,k)); m=k: forL=k+l:n ifmax<abs(al(L,k)) ma】【=abs(a1(L,k)); m=L: end end ifk~=m t=al(k,:); al(k,:)=al(m,:); al(m,:)=t;
S=一S: end
tp=al(k,k); forj=k+l:n al(k,j)=al(k,j)/tp;
end fori=k+1:n forj=l:n temp(1,J)=al(i,J)一al(i,k) al(k,
j); end al(i,:)=temp; end end d(P)=l; fori_l:n forll=l:ml; ifi_=l1: d(P)=d(P)*al(i,11);
end end end d(P)=s}d(P);
end ifd(1)~=0;
fori=2:ml; x(i-1)=d(i)/d(1);
end else x=B; end x%输出线性方程组的解.
2使用Cramer法则求解线性方程组的计算机实现 常用的求解行列式的方法有:对角线法则法(适合于二阶和三阶行列式的求解)、代数余子式法、降阶 法、化成上三角形或下三角形法,采用计算机编程进行求解用的较多的是列主元一高斯消去法求行列式口 . 使用Cramer法则判定及求解线性方程组的关键是计算相关行列式,程序gil.1.m和西1.2.m在求行列式 时使用的是Matlab函数库中求解行列式的函数和列主元一高斯消去法.下面采用化成上三角形法进行求解 行列式,结合Cramer法则的求解步骤,得到求解线性方程组的流程图和源程序ig1.m(基于Matlab7.6环境): 化成上三角形法求解行列式的Cramer法则求解线性方程组的算法流程见图1. 根据对文献[1】源程序改进的思想和算法流程图1,可得到求解线性方程组的源程序gj1.m. functionqiujie=gjl(a) 【n,m1]=size(a); b(1:n,l:ml一1)=a(1:n,l:ml一1); b(1:n,ml:2 (m1-1))=【a(1:n,m1),a(1:n,2:ml一1)J; fori=3:m1: 第3期 张玉兰:基于Matlab的Cramer法则求解线性方程组 b( end l:n,(i-1) (ml一1)+1:i (ml-I))=【a(1:n,1:i-2),a(1:n,m1),a(1:n,i:ml一1)】;
forp=l:ml; al=b(1:n,(p-1) (ml-1)+1:p (ml—1)); f0rk=l:n-1: temp=[]; temp(1:k,:)=al(1:k,:); for i_k+1:1:n: forj=1:m1-1; ifal(i,k)一=O; temp(i,J)=al(i,J)-al(i,k)*al(k,j)/al (k,k); else temp(i,j)=al(i,j); end end end al=口; a1=temp; end d(P)=1; forl=1:n: fort=l:ml—l: ifl==t: d(P)=d(P)*al(I,t):
end end end end ifd(1)~=O: fori=2:m1; X(i-1)=d(i)/d(1); end else x=13; end X%输出线性方程组的解.
3求解实例
图1算法流程图
则 为 空 矩 阵 【】
f + +x3+x4=5 例1 求解线性方程组{ 三 _ 5X4 =:-一22.- 【
3 + -+2 +11 t=0 在Matlab命令窗口中分别输入命令:a:[1l 1 1 5;1 2—1 4—2;2…3 1 5—2;3 1 2 11 0];gil.1(a), gil.2(a), 1(a),可得到运行结果.在Madab命令窗口中结果皆显示为:x:1.000 0 2.000 0 3.000 0
-1.000 0,这和文献[4】提供的求解结果完全吻合. 1 5 +6 =1 l +5 +6 =0 例2 求解线性方程组{ +5 +6 :0.
I +5 +6 =0 ’ 【 +5 =1
在Matlab命令窗口中分别输人命令:a=[5 6 0 0 0 l;1 5 6 0 0 0;0 1 5 6 0 O;0 0 1 5 6 O;0 0 0 1 5 1】; 1.1 (a),商1.2(a),gil(a),可得到相同的运行结果:x=2.266 2—1.721 8 1.057 1-0.594 0 0.318 8,和 文献[4】提供的结果完全吻合,再次证明了本文所给程序的正确性和稳定性.