实验五线性方程组-1240111118-武元甲

  • 格式:doc
  • 大小:52.01 KB
  • 文档页数:3

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

六实验运行结果