线性方程组的求解 计算机课程设计.docx
《线性方程组的求解 计算机课程设计.docx》由会员分享,可在线阅读,更多相关《线性方程组的求解 计算机课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
线性方程组的求解计算机课程设计
测试与光电工程学院
课程设计任务书
测控技术与仪器系107773班学号7777姓名
课题名称:
求线性代数方程组的解
课题要求:
本课程设计在训练和提高学生综合运用vb、c等语言进行编程的能力的同时,可使学生对求解线性代数方程组的消去法和迭代法有更为深入的理解。
本课题的基本内容有:
1、设置一个提示语句提示输入方程的个数;
2、设置一个提示语句提示输入未知数的个数;
3、准确、快速的计算出所输入方程组的解,并显示出来。
课题进程:
1.迭代法与高斯消去法解线性方程组的算法分析2天
2.分别用vc、vb编程实现线性代数方程组的求解5天
3.软件调试和测试,提出改进方案,并进行对比分析2天
4.撰写课程设计报告4天
指导教师:
摘要
许多源于工程技术方面的数学问题,都可以归结为解求线性方程组。
因此在各种数据处理中,线性方程组的求解是最常见的问题之一。
针对求解线性代数方程组,本文提出了两种解法:
迭代法和高斯消去法。
迭代法程序设计简单,可以实现高精度,本文用vc编程实现。
高斯消去法数值较稳定,克服了迭代数据易溢出的缺点,本文用vb编程实现。
相比vc,vb界面更美观,可视性和实用性好,更适合于此款计算软件。
本文中的程序能快速求解出10维以下线性代数代数方程组的解,在迭代法vc程序中提示精度且显示迭代过程,在vb高斯消去法软件根据线性方程组的维数显示输入框,并依次显示计算结果。
可以重复计算。
两款程序都能保证一定的高精度。
这将为计算者带来很大的方便。
关键词:
高斯消去法,迭代法,线性方程,动态数组
指导老师签名:
一.设计要求…………………………………………………………………4
二.设计的目的意义…………………………………………………………4
三.设计思想…………………………………………………………………5
3.1确定方法………………………………………………………………5
3.2数据分析………………………………………………………………6
3.3算法分析………………………………………………………………6
四.软件的编制和调试………………………………………………………8
4.1用迭代法在VC环境下开发…………………………………………8
4.1.1VC环境介绍………………………………………………………8
4.1.2程序流程图………………………………………………………10
4.1.3程序主代码………………………………………………………10
4.1.4程序运行图………………………………………………………13
4.1.5程序说明…………………………………………………………14
4.1.6程序改进方向………………………………………………………14
4.2用高斯消去法在VB环境下开发………………………………………15
4.2.1VB环境介绍………………………………………………………15
4.2.2程序流程图………………………………………………………18
4.2.3程序主代码………………………………………………………19
4.2.4程序运行图………………………………………………………23
4.2.5程序说明…………………………………………………………24
4.2.6程序改进方向………………………………………………………24
5.总结………………………………………………………………………25
6.致谢………………………………………………………………………25
七.参考文献…………………………………………………………………26
附录…………………………………………………………………………26
一.设计要求
要求设计一个简便的科学计算软件可以实现线性代数方程组的求解,软件功能要求如下:
1、设置一个提示语句提示输入方程的个数;
2、设置一个提示语句提示输入未知数的个数;
3、准确、快速的计算出所输入方程组的解,并显示出来。
二.设计的目的意义
许多源于工程技术方面的数学问题,都可以归结为解求线性
方程组。
因此在各种数据处理中,线性方程组的求解是最常见的问题之一。
因此设计一种实用的解线性方程组软件可以给计算带来很大的便利,提高人们的工作效率。
三.设计思想
3.1确定方法
可以使用高斯消去法和迭代法。
迭代法不仅具有程序设计简单,适于自动计算,而且较直接法更少的计算量就可获得满意的解。
因此,迭代法亦是求解线性方程组,尤其是求解具有大型稀疏矩阵的线性方程组的重要方法之一。
Gauss消去法是解线性方程组的一种直接方法,有时也称为精确法,这种算法只包含有限四次运算,并且在每一步运算过程都不会发生舍入误差的假设下,计算的结果就是方程组的精确解。
但实际计算中不可避免舍入误差的存在和影响,所以这种方法只能求得线性方程组的近似解。
3.2编程思路
线性方程组的一般形式是a*x=b,编写这种程序最重要的是算法,正确的编写求解函数高斯消元法首先把矩阵化为上三角阵,根据上三角阵的情况判断解的情况,如果有唯一解则输出结果。
接下来是设计输入对话框,由于矩阵的维数不固定,要根据需要来显示。
根据未知数的个数控制文本框显示的数目、按钮位置和窗口的大小。
可以先创建两个text数组,一个用来输入a,一个用来输入b,另外还可以用两个标签来标记他们的位置,这当中可以用空格来控制。
3.3算法分析
3.3.1高斯消去法
高斯消去法的基本思想是:
对线性代数方程组所对应的增广矩阵(A|b)进行一系列“把某一行的非零常数倍加到另一行上”的初等变换,使得(A|b)中A的对角线一下的元素全变为0,从而使原方程组等价的转化为容易求解的上三角形线性代数方程组,再通过回代得到上三角形线性代数方程组的解,即可求得原方程组的解。
设线性方程组的增广矩阵为:
=
首先,在第一列中选取绝对值最大的元素
作为第一列的主元,即
,然后交换第一行与第i行,经一次消元计算得:
=(A
B)
。
重复上述过程,设已完成第k-1步的选主元素,交换两行及消元过程后(A
B)已约化为:
第k步选主元素,在
右下角方阵的第一列内选取绝对值最大的元素
作为这一列的主元,即
=
,然后交换
的第i行与第k行,再进行消元计算。
如此重复,直到最后将原线性代数方程组化为:
=
回代求解得到
列主元消去法除了每步需要按列选出主元,然后进行对换外,其消去过程与高斯顺序消去法是相同的。
3.3.2迭代法
迭代法的基本思想:
是将线性方程组转化为便于迭代的等价方程组,对任选一组初始值
(i=1,2…n),按某种计算规则,不断地对所得到的值进行修正,最终获得满足精度要求的方程组的近似解。
对于线性方程组Ax=b。
其中,A为非奇异矩阵。
将A分裂为A=M-N,其中,M为非奇异矩阵,且要求线性代数方程组Mx=d容易求解,一般选择为A的某一部分元素构成的矩阵,称M为A的分裂矩阵。
于是,求解Ax=b转化为求解Mx=Nx+b,由此可构造一个迭代法:
x(0)(初始向量),x(k+1)=Bx(k)+f,(k=0,1,2…)
其中,f=b/M,B=I-A/M为迭代法的迭代矩阵。
选取M为A的对角元素组成的矩阵,即选取M=D,可得到解Ax=b的雅克比迭代法:
x(0)(初始向量),x(k+1)=Bx(k)+f(k=0,1,2…)
BJ为求解Ax=b的雅克比迭代法的迭代矩阵。
解雅克比迭代法的计算公式为:
(k=0,1,2,……:
i=1,2,3,……..n)
雅克比方法是求对称矩阵的全部特征值以及相应的特征向量的一种方法,,它是基于以下两个结论:
1)任何实对称矩阵A可以通过正交相似变换成对角型,即存在正交矩阵Q使得
AQ=diag(
)其中
i(i=1,2,…,n)是A的特征值,Q中各列为相应的特征向量。
2)在正交相似变换下,矩阵元素的平方和不变。
即设
,Q为交矩阵,记B=
AQ=
则
雅克比方法的基本思想:
是通过一次正交变换,将A中的一对非0的非对角线化成0,并且使得非对角元素的平方和减小。
反复进行上述过程,使变换后的矩阵的非对角元素的平方和趋于0,从而使该矩阵近似为对角矩阵,得到全部特征值和特征向量。
四.软件的编制和调试
4.1迭代法解线性方程组在VC6.0环境【3】下开发
4.1.1VC6.0环境介绍
VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用有很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
特色:
VisualC++6.0由Microsoft开发,它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
Microsoft的主力软件产品。
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
缺点:
由于C++是由C语言发展起来的,也支持C语言的编译。
6.0版本是使用最多的版本,很经典。
最大的缺点是对于模版的支持比较差。
现在最新补丁为SP6,推荐安装,否则易出现编译时假死状态。
仅支持Windows操作系统。
目前发现与windows7兼容性不好,安装成功后可能会出现无法打开cpp文件的现象。
4.1.2程序流程图
图4.1.2a程序流程图
4.1.3迭代法VC核心编码
structLine*Change(structLine*Lhead,intn){
structLine*p1,*p2,*p3,*p;
structRow*ptr;
inti=1,k,j;
floatmax,t;
if(Lhead==NULL){
printf("链表为空!
\n");
exit
(1);}
p2=Lhead;
while(i<=n){
max=0;
k=0;
t=0.0;
ptr=p2->head;
while(ptr!
=NULL){
if(ptr->R!
=n+1){
t+=fabs(ptr->x);
if(maxx)){
max=fabs(ptr->x);
k=ptr->R;}}
ptr=ptr->link;}
t=t-max;
if(max<=t){
printf("系数矩阵A不具有严格对角优势,该程序不能用Gauss-Jacobi迭代法解该方程组!
\n");
returnNULL;}
if(p2->L==k)
p2=p2->next;
elseif(p2->L>k){
printf("系数矩阵A不具有严格对角优势,该程序不能用Gauss-Jacobi迭代法解该方程组!
\n");
exit(0);}
else{p3=Lhead;
while(p3->L!
=k)
p3=p3->next;
ptr=p3->head;
p3->head=p2->head;
p2->head=ptr;}
i++;}
returnLhead;}
voidDeal(structLine*Lhead,floate,intN,intn){
structTerm*ptr;floatTerm;
structLine*p1;structRow*current;
floatm=0,a,b,c=0;intk=0,i=0;
if(Lhead==NULL)
{printf("链表为空\n");exit
(1);}
ptr=malloc(n*sizeof(Term));
for(i=0;i{(ptr+i)->x=0;(ptr+i)->m=0;}
printf("迭代过程的数据变化表如下:
\n");
printf("K");
4.1.2程序运行图
图4.1.4a程序运行图
图4.1.4b程序运行图
4.1.3程序说明
该程序用于10次以下线性代数代数方程的求解,该程序的优点是能把每步的迭代结果输出(如图4.1.4),并且保证一定的精确度。
运行速度快,算法收敛速度也快。
最重要的是,它能实现循环计算,直到你点击右上角的红叉为止,这给计算者带来了一定的方便,也便于计算者对每次参数的变化输出结果有一定的对比。
缺点是界面并不美观,系数的输入并没有那么的直观。
4.1.4程序改进方向
该程序还有很大的缺陷,在正常使用的情况下一般不会出现错误,但是当计算者没有正常输入或者因马虎输错了字符,该程序可能进入混乱计算界面,这些错误主要是因为溢出造成,所以在这方面可以做进一步改善。
4.2运用高斯消去法在VB环境【4】下开发
4.2.1VB环境介绍
vb是VisualBasic的简称,是由美国微软公司于1991年开发的一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发Windows环境下的各类应用程序。
它简单易学、效率高,且功能强大可以与Windows专业开发工具SDK相媲美。
在VisualBasic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的广泛应用程序接口(API)函数,动态链接库(DLL)、对象的链接与嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发Windows环境下功能强大、图形界面丰富的应用软件系统。
VB编程语言历史
VisualBasic从1991年诞生以来,现在已经20年了。
VisualBasic是微软的起家产品,微软当然不忘了这位功臣。
随着每一次微软技术的浪潮,VisualBasic都会随之获得新生。
可以预见,将来无论微软又发明了什么技术或平台,VisualBasic一定会首先以新的姿态登上去的。
如果你想紧跟微软,永远在最新的技术上最快速地开发,你就应该选择VisualBasic。
特点:
①面向对象
VB采用了面向对象设计思想,它基本思路是把复杂的设计问题分解为多个能够完成独立功能且相对简单的对象集合。
所谓“对象”就是个可操作实体如窗体、窗体中命令按钮、标签、文本框等,面向对象编程就是指程序员可根据界面设计要求直接在界面上设计出窗口、菜单、按钮等类型对象并为每个对象设置属性。
在VB.NET2002和之后的版本,VB是完全支持面向对象的编程语言;而对于早期版本(6.0版和之前的版本),只能称作是基于对象的编程语言,原因是它不支持类的继承。
②事件驱动
在Windows环境下是以事件驱动方式运行每个对象的都能响应多个区别事件,每个事件都能驱动段代码事件过程,该代码决定了对象功能。
通常称这种机制为事件驱动的编程机制。
可由用户操作触发也可以由系统或应用触发例如单击个命令按钮就触发了按钮Click(单击)事件该事件中代码就会被执行,若用户未进行任何操作(未触发事件)则就处于等待状态整个应用就是由彼此独立事件过程构成。
③软件Software集成式开发
VB为编程提供了个集成开发环境,在这个环境中编程者可设计界面、编写代码、调试直至把应用编译成可在Windows中运行的可执行文件,并为它生成安装VB集成开发环境,为编程者提供了很大方便。
④结构化设计语言
VB具有丰富数据类型是种符合结构化设计思想语言而且简单易学此外作为种设计语言VB还有许多独到的处。
⑤强大数据库访问功能
VB利用数据Control控件可以访问多种数据库VB6.O提供ADOControl控件不但可以用最少代码实现数据库操作和控制也可以取代DataControl控件和RDOControl控件。
⑥支持对象链接和嵌入技术
VB核心是对对象链接和嵌入(OLE)技术支持它是访问所有对象种思路方法利用OLE技术能够开发集声音、图像、动画、字处理、Web等对象于一体的功能强大的软件。
⑦网络功能
VB6.0提供了DltTML(Dynamic}tTML)设计工具利用这种技术可以动态创建和编辑Web页面使用户在VB中开发多功能网络应用软件Software。
⑧多个应用向导
VB提供了多种向导如应用向导、安装向导、数据对象向导和数据窗体向导通过它们可以快速地创建区别类型、区别功能应用。
4.2.2程序流程图
No
Yes
Yes
No
图4.2.2程序流程图
4.2.3高斯消元法解线性方程组【5】VB核心编码
OptionExplicit
PublicnumAsInteger
Publica(1To10,1To10)AsDouble
Publicb(1To10)AsDouble
Publicx(1To10)AsDouble
SubGuass()
DimdAsDouble,tAsDouble,js(1To10)AsDouble
Dimi,j,k,l,m,n,iss,NNAsInteger
NN=num+1
l=1
n=num
Fork=1ToNN-1
d=0#
Fori=kToNN
Forj=kToNN
IfAbs(a(i,j))>dThen
d=Abs(a(i,j))
js(k)=j
iss=i
EndIf
Nextj
Nexti
Ifd+1#=1#Then
l=0
Else
Ifjs(k)<>kThen
Fori=1ToNN
t=a(i,k)
a(i,k)=a(i,js(k))
a(i,js(k))=t
Nexti
EndIf
Ifiss<>kThen
Forj=1ToNN
t=a(k,j)
a(k,j)=a(iss,j)
a(iss,j)=t
Nextj
t=b(k)
b(k)=b(iss)
b(iss)=t
EndIf
EndIf
Ifl=0Then
MsgBox("guassfailat1.请正确输入。
")
ExitSub
EndIf
Forj=k+1ToNN
a(j,k)=a(j,k)/a(k,k)
Fori=k+1ToNN
Form=k+1ToNN
a(i,m)=a(i,m)-a(i,k)*a(k,m)
Nextm
b(i)=b(i)-a(i,k)*b(k)
a(i,k)=0
Nexti
Nextj
Nextk
IfAbs(a(n,n))=0Then
l=0
MsgBox("guassfailat2")
ExitSub
EndIf
x(n)=b(n)/a(n,n)
Fori=n-1To1Step-1
t=0#
Forj=i+1ToNN
t=t+a(i,j)*x(j)
Nextj
x(i)=(b(i)-t)/a(i,i)
Nexti
js(n)=NN-1
Fork=NN-1To1Step-1
Ifjs(k)<>kThen
t=x(k)
x(k)=x(js(k))
x(js(k))=t
EndIf
Nextk
EndSub
4.2.4程序运行图
图4.2.4a程序运行图
图4.2.4b程序运行图
4.2.5程序说明
该程序可以完成10维以下的线性代数方程的求解,运算时先输入未知数的个数,点击确定按钮,界面会生成相应数量的文本框,填入数组矩阵后点击计算按钮,在结果标签栏便会顺序出现结果。
该程序的优点是有直观的输入界面(如图4.2.4),能多次清零再进行计算,计算结果有一定的精度。
并且每个输入框都有输入限制,只允许数字和正负号的输入,避免程序输入错误而导致运算出错。
缺点是容错能力差,输入界面略显粗糙。
不过总的来说,以该程序小巧简单的界面来说,用来求解高次方程还是给人一种非常舒服的感觉。
4.2.6程序改进方向
该程序比较完美,唯一不足的就是没法把每步的迭代结果输出。
接着还有一点小地方可以因个人习惯进行改进,就是当输入错误时,让程序弹出一个弹窗提示错在哪里。
这些都可以因不同的要求进一步的去改进。
4.3两种方法优缺点的比较
迭代法具有循环的计算式,方法简单,程序实现方便,能充分利用系数的稀疏性,适宜解大型稀疏矩阵方程组。
迭代法不存在误差累积问题。
使用迭代法的关键问题是其收敛性与收敛速度,收敛性与迭代初值的选取无关。
雅克比迭代法的收敛条件是:
为精度要求
高斯列主元消去法特点是每次在系数矩阵中依次按列在主对角线以下的元素中,选取绝对值最大的元素作为主元,将它调至主对角线上,然后用它去消去对角线以下的元素,最后变为同解的上三角形方程组求解。
如果那一列的所有元素都为0,则说明该方程组解不唯一。
高斯列主元消去法计算简单,工作量大为减少,且计算经验与理论分析均表明,它具有良好的数值稳定性,故列主元法是求解中小型稠密线性方程组的最好方法之一。
五.总结
通过本次课程设计,进一步学会迭代方法和消去法的数学思想,并对程序代码进行解析与改进,这对于我们以后学习和研究实际问题具有重要的意义。
本课题运用所学的数学专业知识来研究,有助于我们进一步掌握大学数学方面的知识,特别是迭代方法。
通过这个课题的研究,我进一步掌握了迭代方法的思想