合肥工业大学计算方法复化梯形公式实验

更新时间:2024-05-14 00:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《计算方法》实验报告

学号 实验项目名称 一、实验名称 姓名 班级 实验二 数值积分 实验二 数值积分 二、实验目的: (1) 熟悉复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法; (2) 能编程实现复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法; (3) 理解并掌握自适应算法和收敛加速算法的基本思想; (4) 分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识 三、实验内容及要求 (1)设计复化梯形公式求积算法,编制并调试相应的函数子程序 (2)设计复化辛浦生求积算法,编制并调试相应的函数子程序 (3)用龙贝格算法计算?10sinxdx x输入:积分区间,误差限 输出:序列Tn,Sn,Cn,Rn及积分结果(参考书本P81的表2-5) 取n=2,4,8,16,精确解为0.9460831 四、实验原理及算法描述 在许多实际问题中,常常需要计算定积分?af(x)dx的值。根据微积分学基本定理,若被积函b数f(x)在区间[a,b]上连续,只要能找到f(x)的一个原函数F(x),便可利用牛顿-莱布尼兹公式?af(x)?F(b)?F(a)求得积分值。 但是在实际使用中,往往遇到如下困难,而不能使用牛顿-莱布尼兹公式。 (1) 找不到用初等函数表示的原函数 (2) 虽然找到了原函数,但因表达式过于复杂而不便计算 (3) f(x)是由测量或计算得到的表格函数 由于以上种种困难,有必要研究积分的数值计算问题。 b计算机科学与工程学院

b利用插值多项式 Pn(x)?f(x)则积分?af(x)dx转化为?P(x)dx,显然易算。?P(x)dx称为ananbb插值型求积公式。最简单的插值型求积公式是梯形公式和Simpson公式,。当求积结点提供较多,可以分段使用少结点的梯形公式和Simpson公式,并称为复化梯形公式、复化Simpson公式。如步长未知,可以通过误差限的控制用区间逐次分半的策略自动选取步长的方法称自适应算法。梯形递推公式给出了区间分半前后的递推关系。由梯形递推公式求得梯形序列,相邻序列值作线性组合得Simpson序列, Simpson序列作线性组合得柯特斯序列, 柯特斯序列作线性组合的龙贝格序列。若|R2-R1|> x >> y >> z; cout << \根据龙贝格算法 求出的精确值为:\ << longbeige(x, y, z) << endl; xingbusheng(0, 1, 2)) -(double (1/15))*xingbusheng(0, 1, 1) << endl; xingbusheng(0, 1, 4)) - (double(1 / 15))*xingbusheng(0, 1, 2)<<\<< longbeige(0, 1, 0.000000001) <

2

计算机科学与工程学院

0.00000001) << endl;; cout << \<<4<<\ << longbeige(0, 1, 0.00000001); return 0; } 2. 复化梯形公式子程序: double tixing(double a, double b, int n) { } } double res = (h / 2.0)*(fa + 2.0*fxk + fb); return res; double fa = f(a); double fb = f(b); double h = (b-a) / n; double fxk = 0.0; for (int k = 1; k <= n - 1; k++) { double xk = a + k*h; fxk = f(xk) + fxk; 3. 复化辛浦生公式子程序: double xingbusheng(double a, double b, int n) { double h = (b - a) /n; double fa = f(a); double fb = f(b); //double s = fb - fa; double x = a; double fxk12 = 0.0; double fxk = 0.0; /*for (int k = 1; k <=n; k++) { } s = (h / 6.0)*s; return s;*/

3

x = x + h / (2.0); double fx = f(x); s = s + 4.0*f(x); x = x + h / (2.0); s = s + 2.0*f(x); 计算机科学与工程学院

} double s = (h / 6)*(fa + 4 * fxk12 + 2 * fxk + fb); return s; for (int k = 1; k <= n - 1; k++) { } double xk = a + k*h; fxk = fxk + f(xk); for (int k = 0; k <= n - 1; k++) { } double xk1 = a + k*h; x = xk1 + h / 2.0; fxk12 = fxk12 + f(x); 4. 龙贝格公式子程序: double longbeige(double a, double b, double wuchaxian) { S2 = T2 + (1 / 3)*(T2 - T1); if (k == 1) { Tck[k] = T2; k++; h = h / 2; T1 = T2;

4

double h = b - a; double T1 = (h / 2.0)*(f(a) + f(b)); int k = 1; double S,x,T2,S2,S1=0,C1=0,C2,R1=0,R2; double Tck[100],Sck[100],Cck[100],Rck[100]; S = 0; x = a + h / 2.0; while (x

} } R2 = C2 + (1 / 63)*(C2 - C1); if (k == 3) { } if (fabs(R2 - R1) >= wuchaxian) { } else { } return R2; R1 = R2; C1 = C2; k++; h = h / 2; T1 = T2; S1 = S2; goto loop1; Tck [k]= T2; R1 = R2; C1 = C2; k++; h = h / 2; T1 = T2; S1 = S2; goto loop1; h = h / 2; T1 = T2; S1 = S2; goto loop1; } C2 = S2 + (1 / 15)*(S2 - S1); if (k == 2) { C1 = C2; Tck[k]=T2; k++; S1 = S2; goto loop1; 5

计算机科学与工程学院

实验结果: 图1 六、实验总结 1. 梯形公式的收敛速度太慢,所以我们才会选择之后的几种公式加快收敛速度。 2. 通过实验可以看出,龙贝格算法大大加快了误差收敛的速度,由梯形序列O(h2) 提高到龙贝格序列的O(h8) 3. 在编程的过程中可以切身体验到龙贝格算法是基于前几种算法的实现才能实现的。从而可以知道其实现可以运用前几种算法。 五、教师评语(或成绩) 教师签字 : 6

计算机科学与工程学院

实验结果: 图1 六、实验总结 1. 梯形公式的收敛速度太慢,所以我们才会选择之后的几种公式加快收敛速度。 2. 通过实验可以看出,龙贝格算法大大加快了误差收敛的速度,由梯形序列O(h2) 提高到龙贝格序列的O(h8) 3. 在编程的过程中可以切身体验到龙贝格算法是基于前几种算法的实现才能实现的。从而可以知道其实现可以运用前几种算法。 五、教师评语(或成绩) 教师签字 : 6

本文来源:https://www.bwwdw.com/article/lac7.html

Top