- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《数值分析》计算实习题目
第一题
姓名:
学号:
学院:航空科学与工程学院
一、开发平台的选择
本题中选择Microsoft Visual Studio 2008作为开发平台,利用VC++作为开发环境,编了一个基于MFC的程序。本程序不仅仅是界面不同,编程的思想和运算的速度都有提高。
其优点是通过设计类,将所求数组、精度、带宽等封装为成员变量,将幂法、反幂法、矩阵与向量相乘、求向量的2范数和求条件数等功能封装成类的成员函数这也就是利用了封装性。在定义类的对象之后可以方便地调用这些成员变量和成员函数。本程序可以很容易地升级为通用性的程序,用户利用可执行文件只需要输入几个参数就可以运算同一类的任意方程,而用户不用像C语言那样改动源代码。
应用面向对象的编程思想还有一个最大的优点是可扩展性。想添加或改变功能只需要改动成员函数就行了而不会影响到程序的其他部分。
同时,利用MFC还可以开发出很友好的程序界面。本次程序的初始化界面如下:
二、算法的设计方案
1、矩阵的存储方案
本矩阵为501阶带状矩阵,要求所有零元素均不存储。于是仅定义二维数组m_Array[ROW_N][COL_N]来存放矩阵A的压缩矩阵,这样可以节省内存空间。在窗口初始化的时候就调用类的构造函数对m_Array[ROW_N][COL_N]进行初始化。虽然在程序界面上显示了矩阵,但非零元素其实是没有存储的。
2、求解矩阵的行列式detA
通过doolittle分解,可知,所以只需将doolittle分解后得到的上三角矩阵U的对角线元素相乘,即可得到行列式A的值。
3、求最小特征值、最大特征值和按模最小特征值
通过幂法求解出按模最大的特征值,记为Eigenvalue[0]。将Eigenvalue[0]作为平移量,调用原点平移函数。对得到的新矩阵应用幂法,求其按模最大的特征值。将求出的新特征值加上Eigenvalue[0]后记为Eigenvalue[1]。比较Eigenvalue[0]与Eigenvalue[1]两个数,较大的数为最大特征值;较小的数为最小特征值。
最后通过反幂法计算出按模最小特征值。其中求解方程组计算向量时,先利用已经编好的LU分解法进行分解,再编写回代过程得到u。
4、求A的与数
利用原点平移,设定每次的平移量为,而后利用反幂法求出相应的值。
5、求A的(谱范数)条件数
由于A为实对称矩阵,故,,所以
6、计算消息的激发
在窗体类中定义一个成员变量m_State,初始化窗体时将它设置为0。当按下“计算”按钮时激发了按钮被按下的消息,程序开始计算,同时将m_State设为1。此时再次按下“计算”按钮将弹出提示框“您已经计算过了!”而不再进行计算了。这样可以保证计算过程只进行一次。当输入新的矩阵重新进行计算时,就再次初始化窗口,此时m_State又被初始化为0,可以再次进行计算。
三、源代码
在光盘中有全部的源代码,请用Microsoft Visual Studio 2008打开。同时还有一个课执行文件可以直接执行。由于有些程序段是MFC直接生成的,这里没有把那部分程序打出。
1、类的设计
类的头文件为:
#pragma once//使头文件只被编译一次
/*常量ROW_N表示压缩矩阵行的维数*/
#define ROW_N 5
/*常量COL_N表示压缩矩阵列的维数*/
#define COL_N 501
class Array//存放所求矩阵A的类。类的成员函数中定义了对类的基本操作。
{
public://声明构造函数和析构函数
Array(void);//默认的构造函数
Array(double array);//重载构造函数,使其能对m_Array数组进行针对其他题目的初始化
~Array(void);//默认的析构函数
public://声明成员变量
//非零元素压缩存储矩阵
double m_Array[ROW_N][COL_N];
//中间存储矩阵
double m_Array_Change[ROW_N][COL_N];
//定义矩阵的上半带宽
int m_s;
//定义矩阵的下半带宽
int m_r;
//定义迭代精度
double m_Accuracy;
public://声明成员函数
//用Doolittle分解法求带状线性方程组的行列式的值
void Doolittle_LU();
//求三个整形数的最大值
int max_3(int a,int b,int c);
//对一个向量进行初始化
void Vector_Initialize(double vector[COL_N]);
//将矩阵恢复到原来的数值
void Restore
文档评论(0)