东北大学数值分析上机实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数值分析》上机实验报告课题三解线性方程组的迭代法
学生姓名:
学生系别:
学生班级:
日期:
上机实践报告
【运行环境】
软件:Windows、Microsoft Visual C++ 6.0
PC一台
【问题提出】
对课题二所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。
【实践要求】
1、体会迭代法求解线性方程组,并能与消去法做比较;
2、分别对不同精度要求,如ε=10-3,10-4,10-5 由迭代次数体会
该迭代法的收敛快慢;
3、对方程组2,3使用SOR方法时,选取松弛因子 =0.8,0.9,1,
1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松
弛因子的最佳者;
4、给出各种算法的设计程序和计算结果。
【目的意义】
1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法
比较;
2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;
3、体会上机计算时,终止步骤 < 或k >(予给的迭代次数),对迭
代法敛散性的意义;
4、体会初始解 x ,松弛因子的选取,对计算结果的影响。
【程序代码】
//Jacobi.cpp
#include
#include
using namespace std;
#define N 15//最大迭代次数
#define P 10//矩阵的阶数
//#define P 8
static double a[10][10]={4,2,-3,-1,2,1,0,0,0,0,
8,6,-5,-3,6,5,0,1,0,0,
4,2,-2,-1,3,2,-1,0,3,1,
0,-2,1,5,-1,3,-1,1,9,4,
-4,2,6,-1,6,7,-3,3,2,3,
8,6,-8,5,7,17,2,6,-3,5,
0,2,-1,3,-4,2,5,3,0,1,
16,10,-11,-9,17,34,2,-1,2,2,
4,6,2,-7,13,9,2,0,12,4,
0,0,-1,8,-3,-24,-8,6,3,-1};
static double b[10]={5,12,3,2,3,46,13,38,19,-21};
static double x_jing[10]={1,-1,0,1,2,0,3,1,-1,2};//精确解
static double x0[10]={0,0,0,0,0,0,0,0,0,0};
static double x1[10];
static int k,i,j;
//static double a[8][8]={4,2,-4,0,2,4,0,0,
// 2,2,-1,-2,1,3,2,0,
// -4,-1,14,1,-8,-3,5,6,
// 矩阵B 0,-2,1,6,-1,-4,-3,3,
// 2,1,-8,-1,22,4,-10,-3,
// 4,3,-3,-4,4,11,1,-4,
// 0,2,5,-3,-10,1,14,2,
// 0,0,6,3,-3,-4,2,19};
//static double b[8]={0,-6,6,23,11,-22,-15,45};
//static double x_jing[8]={1,-1,0,2,1,-1,0,2};
//static double x0[8]={0,0,0,0,0,0,0,0};
//static double x1[8];
//static double a[10][10]={4,-1,0,0,0,0,0,0,0,0,
// -1,4,-1,0,0,0,0,0,0,0,
// 0,-1,4,-1,0,0,0,0,0,0,
// 0,0,-1,4,-1,0,0,0,0,0,
// 矩阵C 0,0,0,-1,4,-1,0,0,0,0,
// 0,0,0,0,-1,4,-1,0,0,0,
// 0,0,0,0,0,-1,4,-1,0,0,
// 0,0,0,0,0,0,-1,4,-1,0,
// 0,0,0,0,0,0,0,-1,4,-1,
// 0,0,0,0,0,0,0,0,-1,4};
//static double b[10]={7,5,-13,2,6,-12,14,-4,5,-5}; //static double x_jing[10]={2,1,-3,0,1,-2,3,0,1,-1}; //static double x0[10]={0,0,0,0,0,0,0,0,0,0};
double Max(int y)//求算该次迭代的误差
{
double sum,max;
for (i=0;i
{
sum=0;
for (j=0;j
sum+=a[i][j]*x0[j];
x1[i]=x0[i]+(b[i]-sum)/a[i][i];
}
max=fabs(x_jing[0]-x1[0]);
for (i=1;i
{
if (fabs(x_jing[i]-x1[i])>max)
max=fabs(x_jing[i]-x1[i]);
}
cout<<"第"< return max;