《数值计算实验报告(共13页).doc》由会员分享,可在线阅读,更多相关《数值计算实验报告(共13页).doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上数值计算实验报告姓名:XX学号:XX专业:XX 实验一1题目 x5-3x3+x-1=0在区间-8,8上。试分别用:二分法Newton法弦截法(割线法):双点弦法Newton下山法,求方程的根,精确到6位有效数字.2.2.1二分法(1)二分法 算法分析设函数有根区间表示为。将有根区间用中点分成两半,计算函数值。如果,就得到方程组的实根,否则检查与是否同号,若同号,则说明所求的根在的右侧,这时令;否则,根在的左侧,这时令,这样新的有根区间的长度为之半。对压缩了的有根区间又施以同样的方法如此反复二分下去,即可得出一系列有根区间其中,每个区间都是前一个区间的一半,因此二分k次
2、后的有根区间的长度为可见,如果二分过程无限地下去,这些有根区间最终必收缩于一点,该点显然就是所求的根。取有根区间的中点作为根的近似值,此时的误差若事先给定的误差要求为,则只需便可以停止二分计算。(2)Newton法 算法分析对于非线性方程,若已知根的一个近似值(在这里是,将在处展成一阶泰勒公式,忽略高次项,有。右端是直线方程,用这个直线方程来近似非线性方程。将非线性方程的根代入,即解得这就是Newton迭代公式。在具体的应用中,写为:,则这样获得的即为按Newton迭代法求得的近似解。(3)弦截法 算法分析由于Newton迭代法有时收敛速度较慢,而且有时函数的一阶导数不易求得或较为复杂,因此,
3、改用两个端点都在变动的弦,即用差商替代Newton迭代公式中的导数,从而导出。这就是双点弦截法。双点弦截法详细的计算步骤为:1)选定初始值,计算,。2)按双点弦法迭代公式计算,并求。3)判断:如果给定精度,则迭代停止;否则,用和分别代替重复2)和3)。(4)牛顿下山法 算法分析Newton下山法是扩大初值范围的修正Newton法。将Newton迭代法的计算结果进行适当的加权平均作为新的改进值,即。从而化简可得Newton下山法迭代公式其中,称为下山因子。在本实验中,选取为下山因子。2.源代码#include math.h#include typedef double D;double f(D
4、x);double fnewton(D x);void divide(D a1,D a2);void newton(D a1);void cord(D a1,D a2);void newton2(D a1);using namespace std;double f(D x)return pow(x,5)-6*pow(x,3)+x-1;double fnewton(D x)if(5*pow(x,4)-9*pow(x,2)+1)!=0) return (pow(x,5)-3*pow(x,3)-1)/(5*pow(x,4)-9*pow(x,2)+1);elsereturn 1;void divide
5、(D a1,D a2)for(;fabs(fabs(a1)-fabs(a2)=1e-6;) if(f(a1)*f(a1+a2)/2)0) a2=(a1+a2)/2;elsea1=(a1+a2)/2;coutendl二分法求得的结果是:(a1+a2)/2endl=1e-6;)a1-=fnewton(a1);coutNewton法求得的结果是:a1endl=1e-6;n+)if(n=50)break;else if(f(a2-f(a2)*(a2-a1)/(f(a2)-f(a1)*f(a1)0|(f(a2)-f(a1)!=0) a1=a2-f(a2)*(a2-a1)/(f(a2)-f(a1); el
6、se a2=a2-f(a2)*(a2-a1)/(f(a2)-f(a1);if(n=50) cout双点弦法求解失败!endlendl;else cout双点弦法求得的结果是: ( a2-f(a2)*(a2-a1)/(f(a2)-f(a1) )endlendl;/return 0;void newton2(D a1)double t=1.0;for(;fabs(f(a1)=1e-6;)a1-=t*fnewton(a1);cout用Newton下山法求得的结果是:a1endlendl;/return 0;int main()double x1,x2; coutx1;coutx2;if(f(x1)*
7、f(x2)0)cout此区间上方程无根endl;system(PAUSE);return 0;divide(x1,x2);newton(x1+x2)/2);cord(x1,x2);newton2(x1+x2)/2);system(PAUSE);return 0; 3.截图 实验题目二1.题目用Gauss消元法、选主元的Gauss消元法求解以下线性方程组的解Ax=b,要求输出消元过程中系数矩阵的变化情况(1) 高斯消元法 算法分析在线性代数里就有用Gauss消元法线性方程组的解。通常,对线性方程组的增广矩阵A进行初等行变换化为上三角矩阵的方法,就成为Gauss消元法。对于任意一矩阵,均可以用Ga
8、uss消元法求解对应线性方程组的解。当用k表示消元过程的次序时,Gauss消元法的计算步骤为:1)Gauss消元过程:设对计算2)回代求解过程:(2) 列主元的Gauss消元法 算法分析列主元的Gauss消元法是在Gauss消元法的基础之上加上了列选主元的步2出绝对值最大的,然后通过行交换将其交换到的位置上。设主元在第个方程,即。若,将和方程互易位置,使新的成为主元,然后继续进行,这一步骤称为列选主元。2.源代码#include#includeusing namespace std;void DisplayMatrix(double *a,int size)coutendl=endl;for(
9、int i=0;isize;i+)for(int j=0;jsize+1;j+)coutsetw(15)setprecision(8)aij;coutendl;coutendl=endl;void Gauss(double *a,int size)int i,j,k;double tmp;cout方程组对应的增广矩阵为:endl;DisplayMatrix(a,size);/输出矩阵,需自己实现该函数 /*消元,第k列对角线以下全消成0*/for(k=0;ksize-1;k+)for(i=k+1;isize;i+)tmp=aik/akk;for(j=k;j=size;j+)aij-=tmp*a
10、kj;coutendl第k+1列消元后的矩阵为:=0;i-)for(j=size-1;ji;j-)aisize-=ajsize*aij;aisize/=aii;/*输出方程组的解,放在数组最后一列中*/coutendl方程的根为:endl;for(i=0;isize;i+)coutxi+1=setiosflags(ios:left)setw(15)setprecision(8)aisize;coutendl;int main() int n,i,j; coutinput the size of equations!n; double *p=new double *n; for( i=0;in;
11、i+) pi=new double n+1; coutInput the matrix of Equations!endl; for(i=0;in;i+) for(j=0;jpij; Gauss(p,n); for ( i=0;in;i+) delete pi; delete p; system(pause);3. 截图实验报告三.1.题目分别用雅格比法与高斯赛德尔迭代法解下列方程组Ax=b,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。(1)A行分别为A1=6,2,-1,A2=1,4,-2,A3=-3,1,4,b1=-3,2,4T, b2=100,
12、-200,345T(2) A行分别为A1=1,0,8,0.8,A2 0.8,1,0.8,A3=0.8,0.8,1;b1=3,2,1 T, b2=5,0,-10T,(3)A行分别为A1=1,3,A2=-7,1;b=4,6T。(1)Jacobi迭代法算法分析线性方程组Ax=b,系数矩阵A非奇异,且aii0。即可以简写为:从上式中分离出变量,将它写成据此便建立了Jacobi迭代公式即可写为这就是解线性方程组的Jacobi迭代公式。也是Jacobi迭代法求解线性方程组的理论基础。源代码#include #include#includeusing namespace std;void jaccobi(d
13、ouble *a,int size)cout雅可比迭代法;double x100=0;double x_tp100=0;for(int i=0;i17;i+)for(int i=0;isize;i+) double tmp=aisize;for(int j=0;ji;j+)tmp-=aij*xj;for(int j=i+1;jsize;j+)tmp-=aij*xj;x_tpi=tmp/aii;for(int i=0;isize;i+)xi=x_tpi;coutendl第i+1迭代:;for(int i=0;isize;i+)coutxi+1=leftsetw(9)setfill( )xi|;c
14、outendl;int main()int n,i,j;coutn;double *mat=new double *n;for( i=0;in;i+)mati=new double n+1;cout请输入增广矩阵:endl;for(i=0;in;i+)for(j=0;jmatij;jaccobi(mat,n);gs(mat,n);for ( i=0;in;i+)delete mati;delete mat;system(PAUSE);return 0;(2)Guass_Sidel迭代法算法分析在Guass_Sidel迭代时,每次迭代充分利用当前最新的迭代值。在迭代收敛时,因新值比老值更准确些,
15、求出新值后,用代替前一次的迭代值继续进行计算,这就充分利用新值建立起Guass_Sidel迭代公式。对于一般形式的方程组,Guass_Sidel迭代公式为源代码#include #include#includeusing namespace std;void gs(double *a,int size)cout高斯赛德尔迭代法;double x100=0;double x_tp100=0;for(int k=0;k17;k+)for(int i=0;isize;i+)double tmp=aisize;for(int j=0;ji;j+)tmp-=aij*xj;for(int j=i+1;js
16、ize;j+)tmp-=aij*xj;xi=tmp/aii;/for(int i=0;isize;i+)/xi=x_tpi;cout第rightsetw(2)i+1迭代:;for(int i=0;isize;i+)coutxi+1=leftsetw(9)setfill( )xi|;coutendl;int main()int n,i,j;coutn;double *mat=new double *n;for( i=0;in;i+)mati=new double n+1; cout请输入增广矩阵:endl;for(i=0;in;i+)for(j=0;jmatij;jaccobi(mat,n);g
17、s(mat,n);for ( i=0;in;i+)delete mati;delete mat;system(PAUSE);return 0;2.结果分析 对于第一组数据和第二组数据,从运算的结果显示得知,无论是Jacobi迭代法还是Gauss-Seidel迭代法,其迭代公式均是收敛的,右端项对迭代公式收敛也均无影响。同时也可以看出Gauss-Seidel迭代法的收敛速度要比Jacobi迭代法的收敛速度快。专心-专注-专业 对于第三组数据和第四组数据,从运算的结果显示得知,Jacobi迭代法迭代公式是发散的。然而Gauss-Seidel迭代法迭代公式却是收敛的,其收敛的速度也较快,右端项对迭代公式的收敛也无影响。因此,可以用Gauss-Seidel迭代法求出这两组数据的结果。 对于第五组数据,从运算的结果显示得知,无论是Jacobi迭代法还是Gauss-Seidel迭代法,其迭代公式均是发散的。因此,无论是用Jacobi迭代法还是用Gauss-Seidel迭代法都求解不出其对应的线性方程组的结果
限制150内