数值计算实验报告.pdf

上传人:tbuqq 文档编号:5451172 上传时间:2020-05-13 格式:PDF 页数:13 大小:272.59KB
返回 下载 相关 举报
数值计算实验报告.pdf_第1页
第1页 / 共13页
数值计算实验报告.pdf_第2页
第2页 / 共13页
数值计算实验报告.pdf_第3页
第3页 / 共13页
数值计算实验报告.pdf_第4页
第4页 / 共13页
数值计算实验报告.pdf_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《数值计算实验报告.pdf》由会员分享,可在线阅读,更多相关《数值计算实验报告.pdf(13页珍藏版)》请在三一文库上搜索。

1、数值计算实验报告 姓名: XX 学号: XX 专业: XX 1 实验一 1题目 x5-3x3+x-1=0 在区间 -8,8上。试分别用:二分法 Newton 法弦截法 (割线法 ):双点弦 法 Newton 下山法,求方程的根,精确到6 位有效数字 . 2.2.1二分法 (1)二分法 算法分析 设函数有根区间表示为,a b 。将有根区间,a b 用中点 0 1 () 2 xab分成两半, 计算函数值() 2 ab f。如果()0 2 ab f,就得到方程组的实根 * 2 ab x,否则 检查 0 ()f x与( )f a是否同号,若同号,则说明所求的根 * x在 0 x 的右侧,这时令 101

2、 ,ax bb;否则,根 * x在 0 x 的左侧,这时令 110 ,aa bx ,这样新的有根区 间 11 ,a b 的长度为,a b 之半。对压缩了的有根区间 11 ,a b又施以同样的方法 如此反复二分下去,即可得出一系列有根区间 1122 , kk a ba ba ba b 其中,每个区间都是前一个区间的一半,因此二分 k 次后的有根区间, kk a b的长 度为 1 () 2 kkk baba 可见,如果二分过程无限地下去, 这些有根区间最终必收缩于一点 * x,该点显然 就是所求的根。 取有根区间, kk ab的中点 *1 () 2 kk xab作为根的近似值,此时的误差 * 1

3、11 ()() 22 kkk k xxbaab 若事先给定的误差要求为,则只需 * 1 1 () 2 k k xxab便可以停止二分计 算。 (2)Newton 法 算法分析 对于非线性方程( )0f x, 若已知根 * x的一个近似值 k x(在这里是mih, 将( )f x 在 k x 处展成一阶泰勒公式, 忽略高次项, 有( )()()() kkk f xf xfxxx。右端是 直线方程,用这个直线方程来近似非线性方程( )f x。将非线性方程( )0f x的根 * x代入 * ()0f x,即 * ()()()0 kkk f xfxxx 2 解得 * () () k k k fx xx

4、 fx 这就是 Newton 迭代公式。 在具体的应用中,写为: 1 () () k kk k f x xx fx ,则这样获得的 1k x即为按 Newton 迭 代法求得的近似解。 (3)弦截法 算法分析 由于 Newton 迭代法有时收敛速度较慢, 而且有时函数的一阶导数( )fx不易 求得或较为复杂, 因此,改用两个端点都在变动的弦, 即用差商 1 1 ()() kk kk fxf x xx 替 代 Newton 迭代公式中的导数( )fx,从而导出 11 1 () () ()() k kkkk kk f x xxxx fxf x 。这就是双点弦截法。 双点弦截法详细的计算步骤为: 1

5、)选定初始值 01 ,xx ,计算 0 ()f x, 1 ()f x。 2)按双点弦法迭代公式计算 2 x ,并求 2 ()f x。 3) 判断: 如果 2 (),f x给定精度,则迭代停止;否则, 用 22 (,()xf x和 11 (,()xf x 分别代替 1100 (,()(,()xf xxf x和重复 2)和 3) 。 (4)牛顿下山法 算法分析 Newton 下山法是扩大初值范围的修正Newton 法。将 Newton 迭代法的计算 结 果 1 () () k kk k f x xx fx 进 行 适 当 的 加 权 平 均 作 为 新 的 改 进 值 1k x, 即 11 (1)

6、 kkk xxx 。从而化简可得 Newton 下山法迭代公式 1 () () k kk k f x xx fx 其中,称为下山因子。在本实验中,选取 1 4 为下山因子。 2.源代码 #include “math.h“ #include typedef double D; double f(D x); double fnewton(D x); void divide(D a1,D a2); void newton(D a1); void cord(D a1,D a2); 3 void newton2(D a1); using namespace std; double f(D x) retu

7、rn 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); else return 1; void divide(D a1,D a2) for(;fabs(fabs(a1)-fabs(a2)=1e-6;) if(f(a1)*f(a1+a2)/2)=1e-6;) a1-=fnewton(a1); cout=1e-6;n+) if(n=50) break; else if(f(a2-f

8、(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); else a2=a2-f(a2)*(a2-a1)/(f(a2)-f(a1); if(n=50) cout=1e-6;) a1-=t*fnewton(a1); coutx1; coutx2; if(f(x1)*f(x2)0) cout 7 #include using namespace std; void DisplayMatrix(double *a,int size) cout=0;i-) for(j=size-1;ji;j

9、-) aisize-=ajsize*aij; aisize/=aii; /*输出方程组的解,放在数组最后一列中*/ coutn; 8 double *p=new double *n; for( i=0;ipij; Gauss(p,n); for ( i=0;i #include #include using namespace std; void jaccobi(double *a,int size) 10 coutn; double *mat=new double *n; for( i=0;imatij; jaccobi(mat,n); gs(mat,n); for ( i=0;i #inc

10、lude #include using namespace std; void gs(double *a,int size) coutn; double *mat=new double *n; for( i=0;imatij; jaccobi(mat,n); gs(mat,n); 12 for ( i=0;in;i+) delete mati; delete mat; system(“PAUSE“); return 0; 2.结果分析 对于第一组数据和第二组数据,从运算的结果显示得知,无论是Jacobi迭代 法还是 Gauss-Seidel 迭代法,其迭代公式均是收敛的,右端项对迭代公式收敛也

11、 均无影响。同时也可以看出Gauss-Seidel 迭代法的收敛速度要比Jacobi迭代法的 收敛速度快。 对于第三组数据和第四组数据,从运算的结果显示得知,Jacobi迭代法迭代 公式是发散的。然而Gauss-Seidel 迭代法迭代公式却是收敛的,其收敛的速度也 较快,右端项对迭代公式的收敛也无影响。因此,可以用Gauss-Seidel 迭代法求 出这两组数据的结果。 对于第五组数据,从运算的结果显示得知,无论是Jacobi 迭代法还是 Gauss-Seidel 迭代法,其迭代公式均是发散的。因此,无论是用Jacobi迭代法还 是用 Gauss-Seidel 迭代法都求解不出其对应的线性方程组的结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1