logo资料库

数值计算方法 雅克比迭代法实验报告及源码.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
实验题目:雅可比迭代法 一、 问题定义 Input 输入 p154 中的 6 阶方程组,要求用雅克比迭代法分析求解方程组的收敛性, 并求出使| | X(k+1)--X(k)| |2<=0.0001 近似解及相应的迭代次数。 二、 问题分析 1、雅可比迭代法是迭代法中求解线性方程的一种典型方法,它是一种解对角元素 几乎都是各行和各列的绝对值最大的值的线性方程组的算法。求解出每个对角元素 并插入近似值,不断迭代直至收敛 2、算法的核心在于如何用代码实现雅可比迭代法的求解过程,可设计一个函数实 现这个功能,雅可比迭代法首先将方程组中的系数矩阵 A 分解成三部分,即:A = L+D+U,如图 1 所示,其中 D 为对角阵,L 为下三角矩阵,U 为上三角矩阵。之后确 定迭代格式,X^(k+1) = B*X^(k) +f ,(这里^表示的是上标,括号内数字即迭代次数), 如图 2 所示,其中 B 称为迭代矩阵,雅克比迭代法中一般记为 J。(k = 0,1,...)再选取 初始迭代向量 X^(0),开始逐次迭代。 3、矩阵形式的雅可比迭代法公式:X(k+1) =BJX(k)+f J (k=0,1,2,3...) 其中 BJ=D-1(L+U) (称为雅可比迭代矩阵),f J =D-1b 迭代过程如下图所示 三、 算法设计 (1) main 函数中必须包括输入 input 系数矩阵 A,向量 b,和误差控制 eps,然后进行雅 可比迭代法求解,达到收敛条件之后,输出 output 解 (2)首先设计 MatrixInput(float A[][MAX_n],int m,int n),输入求解线性方程组的阶,然后 用二维数组存储方程组的增广矩阵系数。VectorInput(float x[],int n)输入一个初始向量,然后 是 VectorOutput(float x[],int n)输出一个数组解,迭代跳出条件误差控制也可以设计一个函数。 这样可以使一个算法看上去很清楚。
(2) 算法核心雅可比迭代法,Jacobi_()中进行相应的迭代算法,由第一个方程解出 X1, 由第二个方程解出 X2,...将方程进行转化,直到满足精度要求跳出循环。求解方法我使用 了动态演示,将每一次迭代之后的解都输出,简单算法可由下图所示 1、输入系数矩阵 A 和向量 b,和误差控制 eps 2、x1={0,0,…..,0} , x2={1,1,…..,1} //赋初值 3、while( ||A*x2-b||>eps) { x1=x2; for(i=0;i #include #include #include #include using namespace std; #define MAX_n 100 #define eps #define MAX_Number 1000 0.0001 void VectorInput(float x[],int n) { int i; cout<<"请输入初始向量"<>A[i][j]; } }; void VectorOutput(float x[],int n) { int i; for(i=1;i<=n;++i) cout<<"x["<eps) return 1; else return 0; }; int Jacobi_(float A[][MAX_n],float x[],int n) { float x_former[MAX_n]; int i,j,k; VectorInput(x,n); k=0; do{ cout<<"第"<
VectorOutput(x,n); } } 五、测试 1、通用测试 书本 p154 页第 7 题数据进行测试,在 Jaboci_()中进行精度的约束,输入数据:
2、边缘测试 另外测试了几组边缘数据如: 0.00001 2.000 1.000 2.000 3.000 X1 X2 2.000(这组数据超过了收敛的精度,所以计算失败) 0.01 2.00 X1 1.00 2.00 3.00 X2 2.00 这个算法是正确的!
分享到:
收藏