实验五线性方程组-1240111118-武元甲
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五线性方程组
一实验目的
通过本课程的实习,学会编写全主元消去法的计算程序。掌握解线性方程组的最基本算法及其运用,进一步了解该解法的功能、优缺点,领会系数矩阵对解的影响。
二实验内容
本实验将线性方程组的高斯-赛德尔迭代法和高斯列主元消去法实现为类CLinear_Equations,调用该类实现线性方程组的求解。该类结构如下
class CLinear_Equations
{
public:
CLinear_Equations(void);
CLinear_Equations(float **ppA,float *pB,int D); //向类中公有变量和指针传递数据~CLinear_Equations(void);
float * Adjust(float * pX);//一步迭代
float * Gauss_Seidel(float * pX0,float e);
float Distance_Vector(float * pX0, float * pX1);//计算两个向量之差的范数
int Search_Pricipal_Element(int Col);//寻找第Col列的主元
void Exchange(int Row1, int Row2);//交换第Row1行与第Row2行的元素
void Slash(int Row);//削去第Row列对角线以下的元素
float * Elimination(void);// 回代过程,返回值为最终解向量
float * Gaussian_Elimination(void);
float **pp_A,*p_B; //分别存放系数矩阵、常数项向量
int m_D; //方程组的维数
};
为了方便,使用二维动态数组。可调用下面的函数为二维指针分配动态存储空间和销毁空间。为了方便程序的移植和重复利用,可将这两个函数写在一个文件MatrixAllocate.h中。
template
bool New(T **&ppData,int H,int W)
{//该函数为二维指针ppData分配动态存储空间
T *ppData1 = new T[W*H];
ppData=new T*[H];
for(int i=0;i { ppData[i]=ppData1+i*W; } return true; } template bool Delete(T **&ppData) {//该函数销毁二维指针ppData T *ppData1=ppData[0]; delete ppData1; delete ppData; ppData=NULL; return true ; } 2.1 高斯-赛德尔迭代法 (1)()()()()1 1221331441111(1)(1)()()()2 2112332442222(1)(1)(1)()()33113223443333(1)(1)4411441()1()1()1(k k k k k n n k k k k k n n k k k k k n n k k x a x a x a x a x b a x a x a x a x a x b a x a x a x a x a x b a x a x a a ++++++++=------+=------+=------+=--(1)(1)()42243344(1)(1)(1)(1)(1)1122331,11)1()k k k n n k k k k k n n n n n n n n nn x a x a x b x a x a x a x a x b a +++++++---⎧⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪----+⎪⎪⎪⎪=------+⎪⎩ 当(1)()k k X X ε+-<时,该迭代过程停止。 首先,需要一个计算两个向量间距离的函数,用以判断迭代过程是否终止。 float CLinear_Equations::Distance_Vector(float * pX0, float * pX1) { } 然后,可将单步迭代编写为一个函数,以方便后面的编程 float * CLinear_Equations::Adjust(float * pX) {//参数存放 ()k X ,返回值为(1)k X + } 最后,调用单步迭代函数Adjust ,实现高斯-赛德尔迭代函数 float * CLinear_Equations::Gauss_Seidel(float * pX0,float e) {//返回值为最终解向量 } 2.2 高斯列主元消去法 高斯列主元削去法可分解为下面几步 (1) 选主元,即对于第Col 列,选出该列主元所在的行Row (而不是获取主元的值); (2) 行交换,即将第Row 行与第Col 行的所有元素互换; (3) 列消元,即将第Col 列的第Col +1行以下的元素消为0,并将第Col 行、第Col 列元素化为1; (4) 从n x 开始,逐步回代,求出解向量。 可以先将这些操作编写为函数 int CLinear_Equations::Search_Pricipal_Element(int Col) {//该函数选取数组pp_A第Col列的主元,返回主元所在的行标 } void CLinear_Equations::Exchange(int Row1, int Row2) {//该函数交换数组pp_A第Row1行和第Row2行的元素 } void CLinear_Equations::Slash(int Col) {//该函数消除数组pp_A第Col列中第Row行以下的元素 } float * CLinear_Equations::Elimination(void) {//该函数为回代过程,返回值为最终解向量 } float * CLinear_Equations::Gaussian_Elimination(void) {//该函数调用上面的函数,实现高斯-赛德尔迭代法,返回值为最终解向量。 } 三实验组织运行要求 实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。 四实验条件 为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。 五实验步骤 非线性方程组(matlab) A = triu(rand(6,4)); x = [2 1 3 2 0 0]'; b = A'*x; y1 = (A')\b opts.UT = true; opts.TRANSA = true; y2 = linsolve(A,b,opts); 六实验运行结果