东北大学 数值分析 07(研)数值分析
- 格式:doc
- 大小:227.50 KB
- 文档页数:5
数值分析实验班级 姓名 学号实验环境: MATLAB实验一 解线性方程组的迭代法(1)一、实验题目 对以下方程组分别采用Jacobi 迭代法, Gaaus-Seidel 迭代法求解和SOR 迭代法求解。
(2)线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------------------13682438141202913726422123417911101610352431205362177586832337616244911315120130123122400105635680000121324⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125 (2)对称正定线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----------------------1924336021411035204111443343104221812334161206538114140231212200420424⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡87654321x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---4515221123660(3)三对角线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------4100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----5541412621357 二、实验要求(1)应用迭代法求线性方程组, 并与直接法作比较。
《数值分析》课程教学大纲课程编号:07054352课程名称:数值分析英文名称:Numerical Analysis课程类型:学科基础课程要求:必修学时/学分:48/3 (讲课学时:40 上机学时:8)适用专业:计算机科学与技术;软件工程一、课程性质与任务“数值分析”是计算机科学与技术、软件工程等相关专业学生的学科基础课,也是其它理、工科专业本科生及研究生的必修或选修课。
数值分析是研究各种数学问题在计算机上通过数值运算,得到数值解答的方法和理论。
随着计算机系统能力的提高和新型数值软件的不断开发,无论在高科技领域还是在传统学科领域,数值分析的理论和方法的作用和影响巨大,是科学工作者和工程技术人员必备的基础知识和工具。
课程的任务是使学生能了解数值分析的基本概念,熟悉常用数值方法的构造原理,了解数值算法复杂性、误差与收敛性分析的基本方法,了解重要数值算法的软件实现过程,使学生系统掌握数值分析的基本概念和分析问题、解决问题的基本方法,为掌握更复杂的现代计算方法打好基础。
内容包括数值计算的基本方法、线性和非线性方程组解法、插值法、数值积分法及微分方程的数值解法。
二、课程与其他课程的联系先修课程:高等数学,线性代数,C语言程序设计,计算基础。
后续课程:人工智能,数字图像处理技术,大数据分析及应用。
三、课程教学目标1.学习使用计算机进行数值计算的基础知识和基本理论知识,能够分辨、选用合适的数值方法解决工程问题。
(支撑毕业能力要求1和2)2. 能掌握常用数值计算方法的构造原理,根据问题设计和综合运用算法设计问题解决方案。
(支撑毕业能力要求1和2)3. 能运用数值算法复杂性、误差与收敛性分析的基本方法初步进行算法分析。
4. 能用计算机语言实现典型的数值计算算法,得到实验技能的基本训练,并具有利用计算机解决常见数学问题的能力;(支撑毕业能力要求4)5.能通过查询阅读文献资料,了解数值分析的前沿和新发展动向,了解数值分析算法原理应用的典型工程领域。
第一周解答:π=0.31415926×10M=1|π-3.141|=0.0005926<1/2 ×10m−n=0.5 ×101−n≤0.5×10−2所以n=3|π-3.142|=0.0004074<1/2 ×10m−n=0.5 ×101−n≤0.5×10−3所以n=4即3.141作为π的近似值具有3位有效数字3.142 有4位解答:√3=1.73205081…=0.173205081…M=1|√3−x|≤0.5×101−n|n=2时0.5×101−n=0.051.73205-x≤0.05x≥1.68205x=1.68205|√3−x|≤0.5×101−n|n=3时0.5×101−n=0.0051.73205-x≤0.005x≥1.72705x=1.72705解答:2256=2128×2128=264×264×2128=232×232×264×2128=216×216×232×264×2128=2×2×22×24×28×216×232×264×2128共计算8次乘法第二周解答:因为在n取一定位数时,1/n过于小导致系统计算为0.因此计算机求和在一定位数以后其余的数字都是0,结果为一常数解答:由于y0=28没有误差,可见误差是由√783引起的,设x=27.982σ=x-√783利用已知的递推算法,y n=y n−1−√783100和实际计算中的递推公式Y n=Y n−1−x/100(Y0=y0)两公式相减,e(Y n)=Y n−y n=Y n−1−y n−1−x−√783100e(Y n)= e(Y n−1)- σ/100此为绝对误差因为σ=x-√783数值恒定不变,因此该递推过程稳定解答:(1)原式=2x2(1−2x)(1−x)(2)e x 在x=0处的泰勒展开式可得: e x =1+x +12!x 2+⋯1n!x 2+R n (x) 所以1−e x x=x+12!x 2+⋯1n!x2x=1+12!x 2+⋯1n!x n−1第三周解答:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡→⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡→⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡61-12001-101-1131-11-301-101-11101112-2-211-11消元消元回代得解,;3,2,2321===x x x解答:1. 使用条件:当系数矩阵 A 的各阶顺序主子式非零时,顺序高斯消去法可以顺利进行;而一般只要系数矩阵 A 的行列式非零,列主元高斯消去法就可以顺利进行。
实验一:解线性方程组的直接方法1、设线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------------------13682438141202913726422123417911101610352431205362177586832337616244911315120130123122400105635680000121324⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125x *= (-1, 0, 1, 2, 0, 3, 1, -1, 2 )T2、设对称正定阵系数阵线方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----------------------192433621411035204111443343104221812334161206538114140231212200420424⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡87654321x x x x x x x x = ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---4515229232060 x * = ( 1, -1, 0, 2, 1, -1, 0, 2 )T3、三对角形线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------41141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x = ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----5541412621357 x *= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )T分别用Gauss 顺序消去法与Gauss 列主元消去法:平方根法与改进平方根法:追赶法求解,编出算法通用程序用列主元消去法求解方程组一: 流程图如下:源程序:#include < iostream >#include < vector >#include < cmath >using namespace std;class CGAUSSSOLVEEQU{private :vector < vector < double >> m_equset; vector < double > m_answer;int m_n;public :void inputEquSet(double in[],int n); void solveEquSet();void outputAnswer();void change(int m,int m2);} ;void CGAUSSSOLVEEQU::inputEquSet(double in[],int n){vector < double > vtemp;m_n=n;for (int i= 0;i < m_n; i++){m_equset.push_back(vtemp);for (int j= 0;j <= m_n; j++){m_equset[i].push_back(in[i*(m_n+1)+j]);}}}void CGAUSSSOLVEEQU::change(int m,int m2){vector < vector < double >> ::iterator iter;iter = m_equset.begin();vector < vector < double >> ::iterator iter2;iter2 = m_equset.begin();//double}void CGAUSSSOLVEEQU::solveEquSet(){vector < vector < double >> ::iterator iter;iter = m_equset.begin();for (int m= 0;m < m_n - 1 ; ++ m){// 将绝对值最大的主元素移上去for (int i=m;i<m_equset.size();i++){if (fabsl(m_equset[m][m]) < fabsl(m_equset[i][m])) {swap( m_equset[m], m_equset[i]);}}// 进行消元for (int i = m + 1 ;i < m_n; ++ i){double dm;dm = m_equset[i][m] / m_equset[m][m];for (int j = m;j < m_n + 1 ; ++ j){m_equset[i][j] -= dm * m_equset[m][j];}}++ iter;}// 初始化m_answer向量for (int i=0 ;i < m_n; ++ i) m_answer.push_back( 0 );// 求解答案m_answer[m_n - 1 ] = m_equset[m_n - 1 ][m_n] / m_equset[m_n - 1 ][m_n - 1 ];for ( int i = m_n - 2 ;i >= 0 ; -- i){m_answer[i] = m_equset[i][m_n];for ( int j = m_n - 1 ;j > i; -- j)m_answer[i] -= m_answer[j] * m_equset[i][j];m_answer[i] /= m_equset[i][i];}}void CGAUSSSOLVEEQU::outputAnswer(){for (int i= 1;i <= m_n; ++ i){cout << " x( " << i << " )= " << m_answer[i - 1 ] << endl;}}int main(){CGAUSSSOLVEEQU myEqu1;double in1[10*11]={4,2,-3,-1,2,1,0,0,0,0,5,8,6,-5,-3,6,5,0,1,0,0,12,4,2,-2,-1,3,2,-1,0,3,1,3,0,-2,1,5,-1,3,-1,1,9,4,2,-4,2,6,-1,6,7,-3,3,2,3,3,8,6,-8,5,7,17,2,6,-3,5,46,0,2,-1,3,-4,2,5,3,0,1,13,16,10,-11,-9,17,34,2,-1,2,2,38,4,6,2,-7,13,9,2,0,12,4,19,0,0,-1,8,-3,-24,-8,6,3,-1,-21};myEqu1.inputEquSet(in1,10);myEqu1.solveEquSet(); myEqu1.outputAnswer(); cout<<endl; cout<<endl; return 1 ;}实验运行结果:实验心得:通过本次实验,我不仅掌握了模块化程序设计的方法,还了解了求解线性方程组的方法,明确了高斯消去法选主元的必要性。
试题__2009___年~__2010___年第 一学期课程名称: 数值分析 专业年级: 2009级(研究生) 考生学号: 考生姓名: 试卷类型: A 卷 √ B 卷 □ 考试方式: 开卷 √ 闭卷 □………………………………………………………………………………………………………一. 填空题(本大题共4小题,每小题4分,共16分)1.设有节点012,,x x x ,其对应的函数()y f x =的值分别为012,,y y y ,则二次拉格朗日插值基函数0()l x 为 。
2.设()2f x x =,则()f x 关于节点0120,1,3x x x ===的二阶向前差分为 。
3.设110111011A -⎡⎤⎢⎥=--⎢⎥⎢⎥-⎣⎦,233x ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,则1A = ,1x = 。
4. 1n +个节点的高斯求积公式的代数精确度为 。
二.简答题(本大题共3小题,每小题8分,共24分)1. 哪种线性方程组可用平方根法求解?为什么说平方根法计算稳定?2. 什么是不动点迭代法?()x ϕ满足什么条件才能保证不动点存在和不动点迭代序列收敛于()x ϕ的不动点?3. 设n 阶矩阵A 具有n 个特征值且满足123n λλλλ>≥≥≥,请简单说明求解矩阵A 的主特征值和特征向量的算法及流程。
三.求一个次数不高于3的多项式()3P x ,满足下列插值条件:并估计误差。
(10分)四.试用1,2,4n =的牛顿-科特斯求积公式计算定积分1011I dx x=+⎰。
(10分) 五.用Newton 法求()cos 0f x x x =-=的近似解。
(10分) 六.试用Doolittle 分解法求解方程组:12325610413191963630x x x -⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥-=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎣⎦⎣⎦⎣⎦(10分) 七.请写出雅可比迭代法求解线性方程组123123123202324812231530x x x x x x x x x ++=⎧⎪++=⎨⎪-+=⎩ 的迭代格式,并判断其是否收敛?(10分)八.就初值问题0(0)y yy y λ'=⎧⎨=⎩考察欧拉显式格式的收敛性。
《数值分析》上机实验报告课题三解线性方程组的迭代法学生姓名:学生系别:学生班级:日期:上机实践报告【运行环境】软件:Windows、Microsoft Visual C++ 6.0PC一台【问题提出】对课题二所列目的和意义的线性方程组,试分别选用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<iostream>#include<cmath>using namespace std;#define N 15//最大迭代次数#define P 10//矩阵的阶数//#define P 8static 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<P;i++){sum=0;for (j=0;j<P;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<P;i++){if (fabs(x_jing[i]-x1[i])>max)max=fabs(x_jing[i]-x1[i]);}cout<<"第"<<y<<"次迭代的误差为"<<max<<endl;return max;}void main(){double e[3]={10e-3,10e-4,10e-5};double max;int t;cout<<"请选择精确度:0、10e-3 1、10e-4 2、103-5 ";cin>>t;for (k=0;k<N;k++){max=Max(k);if (max<e[t])//判断精度是否符合要求,若符合则跳出程序,否则继续迭代{ k=k;break;}else{for (i=0;i<P;i++)x0[i]=x1[i];}}if (k<N)//输出结果{cout<<"迭代次数为"<<k<<endl;cout<<"方程组的解为"<<endl;for (i=0;i<P;i++)cout<<" "<<x1[i]<<endl;}else{cout<<"迭代次数超过"<<N<<"迭代终止!"<<endl;cout<<"方程组的解为"<<endl;for (i=0;i<P;i++)cout<<" "<<x1[i]<<endl;}}//Gauss-Seidol.cpp#include<iostream>#include<cmath>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,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 sum1,sum2,max;for (i=0;i<P;i++){sum1=0;sum2=0;for (j=0;j<=i-1;j++)sum1+=a[i][j]*x1[j];for (j=i+1;j<P;j++)sum2+=a[i][j]*x0[j];x1[i]=(b[i]-sum1-sum2)/a[i][i];}max=fabs(x_jing[0]-x1[0]);for (i=1;i<P;i++){if (fabs(x_jing[i]-x1[i])>max)max=fabs(x_jing[i]-x1[i]);}cout<<"第"<<y<<"次迭代的误差为"<<max<<endl;return max;}void main(){double e[3]={10e-3,10e-4,10e-5};double max;int t;cout<<"请选择精确度:0、10e-3 1、10e-4 2、103-5 ";cin>>t;for (k=0;k<N;k++){max=Max(k);if (max<e[t])//判断精度是否符合要求,若符合则跳出程序,否则继续迭代{ k=k;break;}else{for (i=0;i<P;i++)x0[i]=x1[i];}}if (k<N)//输出结果{cout<<"迭代次数为"<<k<<endl;cout<<"方程组的解为"<<endl;for (i=0;i<P;i++)cout<<" "<<x1[i]<<endl;}else{cout<<"迭代次数超过"<<N<<"迭代终止!"<<endl;cout<<"方程组的解为"<<endl;for (i=0;i<P;i++)cout<<" "<<x1[i]<<endl;}}//SOR.cpp#include<iostream>#include<cmath>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,// 矩阵A 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[P];static double sumx[P];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,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(double w,double y){double sum1,sum2,max;for (i=0;i<P;i++){sum1=0;sum2=0;for (j=0;j<=i-1;j++)sum1+=a[i][j]*x1[j];for (j=i;j<P;j++)sum2+=a[i][j]*x0[j];sumx[i]=w*(b[i]-sum1-sum2)/a[i][i];x1[i]=x0[i]+sumx[i];}max=fabs(x_jing[0]-x1[0]);for (i=1;i<P;i++){if (fabs(x_jing[i]-x1[i])>max)max=fabs(x_jing[i]-x1[i]);}cout<<"第"<<y<<"次迭代的误差为"<<max<<endl;return max;}void main(){double e[3]={10e-3,10e-4,10e-5};double w[5]={0.8,0.9,1,1.1,1.2};double max;int t,l;cout<<"请选择精确度:0、10e-3 1、10e-4 2、103-5 ";cin>>t;cout<<"请选择松弛因子:0、0.8 1、0.9 2、1 3、1.1 4、1.2 ";cin>>l;for (k=0;k<N;k++){max=Max(w[l],k);if (max<e[t])//判断精度是否符合要求,若符合则跳出程序,否则继续迭代{ k=k;break;}else{for (i=0;i<P;i++)x0[i]=x1[i];}}if (k<N)//输出结果{cout<<"迭代次数为"<<k<<endl;cout<<"方程组的解为"<<endl;for (i=0;i<P;i++)cout<<" "<<x1[i]<<endl;}else{cout<<"迭代次数超过"<<N<<"迭代终止!"<<endl;cout<<"方程组的解为"<<endl;for (i=0;i<P;i++)cout<<" "<<x1[i]<<endl;}}【运行结果】方程A :⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡1-421534100368-24-3-81-012029137-2621-234179-11-1003524-31-23-6217758-6233-761-62911-31-512-301-231-2-2010563-5-6000121-3-2416084-0484⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125Jacobi 迭代Gauss-Seidol迭代SOR迭代方程B Jacobi迭代Gauss-Seidol迭代SOR迭代方程C ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡554141262135741-000000001-000000041-0000001-41-0000001-41-0000001-41-0000001-41-0000001-41-0000001-41-0000001-400000001-000000001-410987654321x x x x x x x x x xJacobi 迭代Gauss-Seidol迭代(选取了不同的精度)SOR迭代(选取了不同的松弛因子)【结果分析】1、通过实验结果看出(方程C的Gauss-Seidol迭代),取的精度不同,迭代的次数也不同。
数值分析实验报告课题一 迭代格式的比较一、问题提出设方程f(x)=x 3- 3x –1=0 有三个实根 x *1=1.8793 , x *2=-0.34727 ,x *3=-1.53209现采用下面三种不同计算格式,求 f(x)=0的根 x *1 或x *21、 x =213x x + 2、 x = 313-x3、 x = 313+x二、要求1、编制一个程序进行运算,最后打印出每种迭代格式的敛散情况;2、用事后误差估计k k x x -+1〈ε来控制迭代次数,并且打印出迭代的次数;3、初始值的选取对迭代收敛有何影响;4、分析迭代收敛和发散的原因。
三、目的和意义1、通过实验进一步了解方程求根的算法;2、认识选择计算格式的重要性;3、掌握迭代算法和精度控制;4、明确迭代收敛性与初值选取的关系。
程序代码:#include<iostream> #include<cmath> #include<cstdlib> using namespace std;double f(double i) //外调函数f(x),每次更新新的函数 {//以第一种迭代方式为例子 double k,m,sum; k=3*i+1;m=pow(i,2.0); sum=k/m; return sum; }int main() {double x,x0;int N;//最大迭代次数 int k;cout<<"输入初解:"; cin>>x0;cout<<"输入最大迭代次数:"; cin>>N;for(k=1;k<=N;k++){x=f(x0);if(fabs(x-x0)<0.0000001){cout<<"迭代次数:"<<k<<endl;cout<<"输出得到的解:"<<x<<endl;system("pause");return 0;}else x0=x;}cout<<"已达到最大迭代次数:"<<N<<endl;cout<<"输出得到的解:"<<x<<endl;system("pause");return 0;}实验结果:四、程序运行结果讨论和分析:对于第一种迭代格式,收敛区间[-8.2 -0.4],在该收敛区间内迭代收敛于-1.53209,只能求得方程的一个根;对于第二种迭代格式,收敛区间[-1.5 1.8],在该收敛区间内迭代收敛于-0.34730,同样只能求得方程的一个根;对于第三种迭代格式,收敛区间[-0.3 +∞),在该收敛区间内迭代收敛于 1.87937,只能求得方程的一个根;由以上结果很容易发现,初值的选取对迭代敛散性有很大影响。
数值分析试题一.(10分)设给实数0a >,初值00x >:⑴试建立求1a的Newton 迭代公式,要求在迭代函数中不含除法运算; ⑵证明给定初值0x ,迭代收敛的充分必要条件为020x a<<;⑶该迭代的收敛速度是多少?⑷取00.1x =,计算15的近似值,要求计算迭代三次的值(结果保留5位小数)。
二.(10分)试确定参数,,a b c ,使得下面分段多项式函数()s x 是三次样条函数。
332,01()1(1)(1)(1),132x x s x x a x b x c x ⎧≤≤⎪=⎨--+-+-+≤≤⎪⎩ ()s x 是否是自然样条函数?三.(10分)利用Dollite 三角分解方法求解方程组123121022331302x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥--⎣⎦⎣⎦⎣⎦ 四.(10分)给定3阶线性方程组123122*********x x x -⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦讨论其Jacobi 迭代格式的收敛性五.(10分)推导出中矩形求积公式()()()2baa b f x dx b a f +≈-⎰ ,并求出其截断误差。
六.(10分用最小二乘法确定拟合公式bx y ae =中的参数,a b 。
七.(10分)根据已知函数表:建立不超过三次的Newton 插值项式。
八.(10分)试确定常数01,A A ,使求积公式1011()(f x dx A f A f -≈+⎰有尽可能高的代数精度,并指出代数精度是多少,该公式是否是Gauss 型?并用此公式计算积分311I dx x=⎰(结果保留5位小数)。
九.(10分)利用经典四阶Runge-Kutta 方法求初值问题:20,01(0)1y y x y '=-≤≤⎧⎨=⎩在0.2x =处的数值解(取步长0.1h =)。
10.(10分)讨论两步方法 11112(4)33n n n ny y y hy +-+'=-+ 的局部截断误差,求出它的局部阶段误差的首项(主部),它是多少阶的? (在线性多步法的局部截断误差中10111[()()],2,3,!p prr r i i i i C i a r i b r r -==-⎧⎫=--+-=⎨⎬⎩⎭∑∑ )。
数值分析试题 2007.12一、简答下列各题:(每题4分,共20分)1.为了提高计算精度,求方程x 2-72x+1=0的根,应采用何种公式,为什么?2.设⎪⎪⎭⎫ ⎝⎛=2112A ,求)(A ρ和2)(A Cond 。
3.设⎪⎪⎪⎭⎫ ⎝⎛=131122321A ,求A 的LU 分解式。
4.问23221)2(x x x x ++=是不是3R 上的向量范数,为什么? 5.求数值积分公式⎰-≈ba ab a f dx x f ))(()(的截断误差R[ƒ]。
二、解答下列各题:(每题8分,共56分)1.已知线性方程组⎪⎩⎪⎨⎧=-+=-+=-+3532314321321321x x x x x x x x x ,问能用哪些方法求解?为什么?2.解线性方程组b Ax =的Gauss-Seidel 迭代法是否收敛?为什么?其中:⎪⎪⎪⎭⎫ ⎝⎛--=211111112A3.设]2,0[)(4C x f y ∈=,且0)0(,0)2(,2)1(,1)0(='===f f f f ,试求)(x f 的三次插值多项式)(3x H ,并写出余项)()()(33x H x f x R -=。
4.给定离散数据试求形如3bx a y +=的拟合曲线。
5.求区间[0,1]上权函数为x x =)(ρ的正交多项式)(0x p ,)(1x p 和)(2x p 。
6.确定求积系数321,,A A A ,使求积公式:⎰+++-≈31321)532()2()532()(f A f A f A dx x f具有尽可能高的代数精度,并问代数精度是多少?7. 利用2=n 的复化Simpson 公式计算计算定积分 ,并估计误差][f R 。
三、(12分)已知方程0cos 2=-x x , 1.证明此方程有唯一正根α;2.建立一个收敛的迭代格式,使对任意初值]1,0[0∈x 都收敛,说明收敛理由和收敛阶。
3.若取初值00=x ,用此迭代法求精度为510-=ε的近似根,需要迭代多少步? 四、(12分)已知求解常微分方程初值问题:⎩⎨⎧∈=='],[,)(),(b a x a y y x f y α的差分公式:⎪⎪⎪⎩⎪⎪⎪⎨⎧=++==++=+α0121211)32,32(),()3(4y hk y h x f k y x f k k k h y y n n n n n n 1.证明:此差分公式是二阶方法;2.用此差分公式求解初值问题1)0(,10=-='y y y 时,取步长h=0.25,所得数值解是否稳定,为什么?⎰10sin xdx数值分析试题(参考答案)一、1.应采用公式:1211221)13636(,13636---+==-+=x x x ,避免相近数相减。
2.A 的特征值为3,121==λλ,所以)(A ρ=3;2)(A Cond =3⨯1=1。
3.由⎪⎪⎪⎭⎫ ⎝⎛=131122321A ⎪⎪⎪⎭⎫ ⎝⎛----→2/92/11522321,故⎪⎪⎪⎭⎫⎝⎛---⎪⎪⎪⎭⎫ ⎝⎛-=2/95232112/11121A 。
4.不是,不满足非负性(如0)2,1,0(≠-=T x ,但0=x )。
5.⎰--=ba ab a f dx x f f R ))(()()(),(,2)()())((2b a a b f dx a x f bax ∈-'=-'=⎰ξξξ.二、1.由于系数矩阵各阶顺序主子式都不为零,所以可用顺序Gauss 消元法; 由于系数矩阵行列式不为零,也可以用列主元(全主元)Gauss 消元法; 由于系数矩阵各阶顺序主子式都不为零,所以可用直接三角分解法(LU ). 由于系数矩阵是严格对角占优矩阵,可用J-法,G-S 法和SOR(10≤<ω)法。
2.令021112=--λλλλλλ得:0)12(2=+λλ,所以G-S 迭代矩阵G 的特征值为:2/1,0321-===λλλ,于是12/1)(<=G ρ,所以G-S 迭代法收敛。
3.设002211003)()()()()(y x y x y x y x x H '+++=ψϕϕϕ)(2)(10x x ϕϕ+= 其中,)2)(1)(()(0--+=x x b ax x ϕ)2)(1)(23(4/1--+=x x x)2()(21-=x Cx x ϕ)2(2--=x x所以,)2(2)2)(1)(23(4/1)(23----+=x x x x x x H )2)(25(4/12-++-=x x x 〔或令)2)(()(23-++=x c bx ax x H ,用待定系数法求出。
〕余项为:)2,0(,)2)(1(!4)()()()(2)4(33∈--=-=x x x x x f x H x f x R ξξ 4.取310)(,1)(x x x ==ϕϕ,则有T T T f x )2,0,1,1(,)8,1,0,1()(,)1,1,1,1(10-=-==ϕϕ,正则方程组为⎩⎨⎧=+=+15668284b a b a ,拟合曲线:3322.006.05011503x x y -=+=。
5.区间[0,1]上x x =)(ρ的正交多项式:1)(0=x p ,32),(),()(1010200001-=-=-=⎰⎰x xdxdx x x p p p p x x x p ,)32()3/2()3/2()(12103110322-----=⎰⎰⎰⎰x dxx x dxx x xdx dxx x x p 103562+-=x x 。
6.令公式对f(x)=1,x,x 2精确成立,得2321=++A A A ,4)5/32(2)5/32(321=+++-A A A , 解得:98,95231===A A A3/26)5/32(4)5/32(32212=+++-A A A所以,公式为:)]5/32(5)2(8)5/32(5[91)(31+++-≈⎰f f f dx x ff(x)=x 3时,左=20,右=180/9=20,公式精确成立,f(x)=x 4时,左=242/5,右=2178/5/9=242/5,公式精确成立, f(x)=x 5时,左=364/3,右=1092/9=364/3,公式精确成立, f(x)=x 6时,公式不精确成立,所以,公式的代数精度为5。
7.=++++=≈⎰]1sin 43sin 441sin 421sin 20[sin 121sin 210S xdx 0.459707744000018261.01628801sin 22880)01(|)(|445≈⨯=⨯-≤M f R 三、1.记x x x f cos 2)(-=,由于0sin 2)(>+='x x f ,所以)(x f 是严格单调增函数,又由于01)0(<-=f ,01cos 2)1(>-=f ,所以方程0)(=x f 有唯一正根α,且在区间(0,1)内。
2.将方程改写为:2/cos x x =可建立迭代格式:,...2,1,0,cos 2/11==+k x x k k ,且迭代函数为:x x cos 2/1)(=ϕ。
由于]1,0[,12/1)(1cos 2/10∈<≤≤<x x ϕ ,且]1,0[,121sin sin 21)(∈<≤='x x x ϕ,所以,对任意]1,0[0∈x 此迭代法收敛,又由于)1,0(,0sin 21)(∈≠='αααϕ此迭代法是线性收敛的,即收敛阶为1。
3.128.13)1sin 2/1ln(/2/1)1sin 2/11(10ln ln /||)1(ln 501≈-=--≥-L x x L k ε,k =14。
若取L=1/2,可得k ≥16.6096,则取k =17。
四、1.由于+∂∂+∂∂+=++=)(32)32,32(12n nn n n n f yf x f h f hk y h x f k)()9494294(23222222222h O f h yf f h y x f h x f h n n n n n +∂∂+∂∂∂+∂∂+ 所以有:+∂∂+∂∂++=+)(221n n n n n n f y f x f h hf y y )()2(642222223h O f yf f y x f x f h n n n n n +∂∂+∂∂∂+∂∂+ 又由于:)()(!31)(21)()()()(4321h O h x y h x y h x y x y h x y x y n n n n n n +'''+''+'+=+=+ +∂∂+∂∂++=)(22n nn n n f yf x f h hf y )()(!643h O x y h n +''' 所以有:)()(311h O y x y n n =-++,此差分公式是二阶方法。
2.对1)0(,10=-='y y y ,由于)320(10,1021n n n hy y k y k --=-=,差分公式为: n n n y h h k k hy y )50101()3(42211+-=++=+ 当h =0.25时,由于|1-10h+50h 2|=1.625>1,所以,所得数值解不稳定。