线性方程组的求解-——计算机课程设计文档格式.doc
《线性方程组的求解-——计算机课程设计文档格式.doc》由会员分享,可在线阅读,更多相关《线性方程组的求解-——计算机课程设计文档格式.doc(43页珍藏版)》请在冰点文库上搜索。
![线性方程组的求解-——计算机课程设计文档格式.doc](https://file1.bingdoc.com/fileroot1/2023-4/28/06d8159f-fac1-4482-a934-61c7360e2585/06d8159f-fac1-4482-a934-61c7360e25851.gif)
三.设计思想…………………………………………………………………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
五.总结………………………………………………………………………25
六.致谢………………………………………………………………………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行,经一次消元计算得:
=(AB)。
重复上述过程,设已完成第k-1步的选主元素,交换两行及消元过程后(AB)已约化为:
第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++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.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(max<
fabs(ptr->
x)){
max=fabs(ptr->
k=ptr->
R;
}}
ptr=ptr->
link;
t=t-max;
if(max<
=t){
printf("
系数矩阵A不具有严格对角优势,该程序不能用Gauss-Jacobi迭代法解该方程组!
returnNULL;
if(p2->
L==k)
p2=p2->
next;
elseif(p2->
L>
k){
exit(0);
else{p3=Lhead;
while(p3->
L!
=k)
p3=p3->
ptr=p3->
p3->
head=p2->
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<
n;
i++)
{(ptr+i)->
x=0;
(ptr+i)->
m=0;
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程序流程图
=0?
No
;
(i=k+1,…,n;
j=k+1,…,n+1)
开始
输入A矩阵
k=1
Yes
k<
n-1
(j=k+1,k+2,…,n;
k=n,n-1,…,2,1)
k=k+1
结束
图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
Ifiss<
Forj=1ToNN
t=a(k,j)
a(k,j)=a(iss,j)
a(iss,j)=t
t=b(k)
b(k)=b(iss)
b(iss)=t
EndIf
Ifl=0Then
MsgBox("
guassfailat1.请正确输入。
"
)
ExitSub
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
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