logo资料库

病态线性方程组的求解的源代码及运行结果截图.docx

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
《科学与工程计算》实验报告
一、实验内容:
二、程序设计的基本思想、原理和算法描述:
三、源程序及注释:
四、运行输出结果:
五、结果比较分析:
六、调试和运行程序过程中产生的问题及采取的措施:
七、对算法的程序的讨论、分析,改进设想,其它经验教训:
《科学与工程计算》实验报告 学 号: 姓 名:
一、实验内容: 考虑方程组 Hx=b 的求解,其中系数矩阵 H 为 Hilbert 矩阵, H  ( h , nnji  ) , h , ji  1 j  , 1 i i , j ,2,1  , n 这是一个著名的病态问题。通过首先给定解(例如取为各个分量均为 1)再计算出右端 b 的办法给出确定 的问题。 实验要求: (1)选择问题的维数为 6,分别用 Jacobi 迭代法、GS 迭代法和 SOR 迭代法求解方程组,其各自的结 果如何?将计算结果与问题的解比较,结论如何? (2)逐步增大问题的维数,仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么? (3)讨论病态问题求解的算法。 二、程序设计的基本思想、原理和算法描述: 1、 算法 Jacobi 迭代法 若 A 为稀疏矩阵,只需遍历非零元素 GS 迭代法 若 A 为稀疏矩阵,只需遍历非零元素 每步迭代计算量相当于一次矩阵与向量的乘法;不需要保留上一步的迭代解,与 Jacobi 迭代法计算量一 样。 SOR 迭代法(稠密矩阵) 2、 函数组成
double max(double array[100]) 求数组中的最大值函数 3、 输入/输出设计 对于方程组 Hx=b 的求解,系数矩阵 H 为 Hilbert 矩阵,矩阵中的数由下列函数生成。 H  ( h , nnji  ) , h , ji  1 j  , 1 i i , j ,2,1  , n X*取一个特解[1,1,1,……,1] b 数组由矩阵的每行元素相加得来。 4、符号名说明 double c[100] 用来存储第 k+1 次和第 k 次迭代结果的差值的绝对值 double x[100] 第 k+1 次迭代结果,储存解数组 double x0[100] 初始向量 double r 第 k+1 次和第 k 次迭代结果的差值的绝对值的最大值 double sum 矩阵方程变换后右侧值的和 迭代次数 int k double a[100][100] 存储 Hilbert 矩阵 double b[100] 存储 b 向量 三、源程序及注释: Jacobi 迭代法 #include #include #include #include using namespace std; int n; double max(double array[100])//求最大值函数 { } double a=array[0]; int i; for(i=1; i
{ double s=0; int i,k,j;//k 为迭代次数 double a[100][100]; double b[100]= {0.0}; cout<<"请输入维数:"<>n; cout<<"输出 a 数组:"<>s; for(k=1;; k++) { for(i=0; i
} r=max(c); if(r #include #include #include using namespace std; int n; double max(double array[100])//求最大值函数 { double a=array[0]; int i; for(i=1;i
cin>>n; cout<<"输出 a 数组:"<>s; for(k=1;;k++) { for(i=0;i
} } SOR 迭代法 #include #include #include #include using namespace std; int n; double max(double array[100]) { double a=array[0]; int i; for(i=1;i>n; cout<<"输出 a 数组:"<
cout<>s; cout<<"输入松弛因子:"<>w; for(k=1;;k++) { for(i=0;i
分享到:
收藏