实验题目:雅可比迭代法
一、
问题定义
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<<"请输入初始向量"<>x[i];
}
};
void MatrixInput(float A[][MAX_n],int m,int n)
{
int i,j;
cout<<"\n===请输入要求解方程的增广矩阵===\n";
for(i=1;i<=m;++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<<"第"<}
cout<
eps)
x[i]/=A[i][i];
else
return 1;
}
++k;
}while(limit(x,x_former,n) && k=MAX_Number)
return 1;
else
{
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
这个算法是正确的!