


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数值计算基础实验指导书2010年目录3实验12 实验三6 实验四常8实验五迭代法实验一直接法解线性方程组的 二 插 值 方法 数值积分 微分方程的数值解 解线性方程组与非线性方程实验一直接法解线性方程组一、实验目的掌握全选主元消去法与高斯-塞德尔法解线性方程组。二、实验内容分别写出Guass列选主元消去法与追赶法的算法, 编写程序上机调试出结果,要求所编 程序适用于任何一解线性方程组问题, 即能解决这一类问题,而不是某一个问题。实验中以 下列数据验证程序的正确性。52.35.13.7X15.9.61.5x3.8321.74.5.51、用Guass列选主元消去法求解方程组2、用追赶法求解方程组2
2、 0 0 0010x101200x0201200X300010x02400012X50三、实验仪器设备与材料主流微型计算机四、实验原理1、Guass列选主元消去法对于AX= BA B是上三角矩阵。即:n1a12aa 1 n1b 121aa b1n1aa 22a2nb201a2naan2bnn00a nn),其中A1 )、消元过程:将 (A|B)进行变换为21nb2bn到n-1选取第k列中绝对值最大元素a、列选主元axb、换行aikk in作为主元。akja/k 1, ,nbkbic、归一化d、消兀akj /akkbkbk1, ,nbi/akkaijaikakjai k 1, ,n;j kaik
3、b kbi,ik 1,n2 )、回代过程:由(Al B)解出x,Xnn11,x。b n / a nnnXnbka©%1Xk,k1,2,12、追赶法线性方程组为:a1X2a?C2b2b3 a3C3CnanbnXn做LU分解为:,R分解公式:2,3,n)i bi , i bi(i 2,3,n)(i 1,2, ,n 1)i则LUx fLy fAx fUx y回代公式:fiyi1fi(i 2,3,n)y LiiYi 1i(i n 1,n2,1)Xn ynxi yi iXi 1五、实验步骤1、理解并掌握全选主元消去法与高斯-塞德尔迭代法公式;2、画出全选主元消去法与高斯 -塞德尔迭代法的流程图
4、3、使用C语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、 实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。八、思考题若使用全主元消去法,在编程中应如何记录保存对于未知数的调换。实验二插值方法一、实验目的掌握拉格郎日插值法与牛顿插值法构造插值多项式。二、实验内容分别写出拉格郎日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于任何
5、一组插值节点, 即能解决这一类问题,而不是某一个问题。实验中以下列数据 验证程序的正确性。已知下列函数表Xiy求时的函数值。三、实验仪器设备与材料主流微型计算机四、实验原理已知n个插值节点的函数值,则可由拉格郎日插值公式与牛顿插值公式构造出插值多项式,从而由该插值多项式求出所要求点的函数值。拉格郎日插值公式与牛顿插值公式如下:1、Lagrange 插值公式nLn(X)lo(x)yoli(x)yi|n(x)ynyJO)k 0嗾-(x X。)(X Xi).1 (XXk 1)(Xxn )(X jX)nXXkXo)(XkXi)(xkXk )(Xk Xk )1 1(Xk xn)j XkXjn0j2、Ne
6、wt on插值公式kNn(x)f(Xo) fXo,Xi(XXo)fXo,X1 ,X2(XXo)(X X1)fXo,Xi , Xn(XXo)(X X1) (XXn 1)五、实验步骤1、理解并掌握拉格郎日插值法与牛顿插值法的公式;2、画出拉格郎日插值法与牛顿插值法算法的流程图;3、使用C语言编写出相应的程序并调试验证通过。六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项Newton 插值法在
7、编程时应注意定义何种数据结构以保存差商。八、思考题比较 Lagrange 插值法与 Newton 插值法的异同。实验三数值积分、实验目的掌握复化梯形法与龙贝格法计算定积分。二、实验内容分别写出变步长梯形法与 Romberge法计算定积分的算法,编写程序上机调试出结果, 要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。isin x求 dx, 0.00001。 0 x三、实验仪器设备与材料主流微型计算机四、实验原理通过变步长梯形法与龙贝格法,我们只要知道已知n个求积节点的函数值,则可由相应的公式求出该函数的积分值,从而不需要求该函数的原函
8、数。变步长梯形法与龙贝格法公式如下:1、变步长梯形法T2n用T2nTnf(Xi i)n 1f(x) f(b)i 1f(xi 1/2 )0来控制精度2、龙贝格法n2 Tnhnf(xi1/2)2i 016S1515nRn64163CT用R2n Rn|来控制精度五、实验步骤1、理解并掌握变步长梯形法与龙贝格法的公式;2、画出变步长梯形法与龙贝格法的流程图3、使用C语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图
9、形式保存并打印后粘贴在实验报告册内。七、实验注意事项1 sin x在dx积分中,被积函数在x=0点函数值为1,对该点在程序设计中应注意对其0x的定义。八、思考题使用复化梯形法与复化Simps on法来计算该问题有何缺点?实验四常微分方程的数值解、实验目的掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题。二、实验内容分别写出改进欧拉法与四阶龙格-库塔求解的算法,编写程序上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。2步长h=5。(0 x 5)y xy求y(0)2三、实验仪器设备与材料主流微型计算
10、机四、实验原理常微分方程的数值解主要采用“步进式”,即求解过程顺着节点排列次序一步一步向前推进,在单步法中改进欧拉法和四阶龙格-库塔法公式如下:1、改进欧拉法hf(Xn,yn)yn 1ynyn1yn2、四阶龙格hyn处x齐-库塔法f(x,y n 1 )k1yn _6(k1 f(Xn,yn)2k3k4)k2K4f(Xnh,yn纺)hk2五、实验步骤1、理解并掌握改进欧拉法与四阶龙格 -库塔法的公式;2、画出改进欧拉法与四阶龙格 -库塔法的流程图3、使用C语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、
11、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项y2Xy2(0 X 5)的精确解为y 2/(1 x),通过调整步长,观察结果的y(o)2精度的变化八、思考题如何对四阶龙格-库塔法进行改进,以保证结果的精度。建立高斯-塞德尔迭代格式为:(k 1)Xii1(dii 1(k1)(k)ajXj )/aH,i 1,2, ,nj i3)取初值迭代求解至所要求的精度为止。2、牛顿法实验五迭代法解线性方程组与非线性方程 一、实验目的掌握高斯-塞德尔迭代法求解线性方程组与牛顿迭代法求方程根。二、实验内容分别写出高
12、斯-塞德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题, 而不是某一个问题。 实验中以下列数据验证程序的正确性。1、高斯-塞德尔迭代法求解线性方程组721X124915372X225x12113132013X42、用牛顿迭代法求方程X )直接分离xi,即n Xi (dibijXj)/aii,i 1,2, ,nj 1X 10的近似根,0.00001,牛顿法的初始值为1。三、实验仪器设备与材料主流微型计算机四、实验原理二分法通过将含根区间逐步二分, 从而将根的区间缩小到容许误差范围。牛顿通过迭代的方法逐步趋进于精确解,该两种方法的公式如
13、下:1、高斯-塞德尔迭代法1)判断线性方程组是否主对角占优nj 1 ai 1,2, ,nj ix x-fxkrk 1 kkf (x)五、实验步骤1、理解并掌握二分法与牛顿法的公式;2、画出二分法与牛顿法的流程图3、使用C语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、 实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项对于二分法应注意二分后如何判断根的区间,对于牛顿法注意如何确定迭代过程的结束八、思考题
14、若使用牛顿法是发散的,如何对牛顿法进行改进以保证其收敛性。前三个实验的程序代码(C/C+ )和运行结果截图#includeviostreaGauss全选主元解方程组的源程序及运行结果m>#i nclude<stdlib.h> #i nclude<math.h>usingn amespacestd;class Matrixpublic:Matrix();Matrix();voidSetMatrix(co nsti ntn,con stdoubleesp1);/构造线性方程组相应的矩阵,n为方程的未知数数目,esp1为要求的精度voidMax(co nsti ntr)
15、;全选主元voidChangeRC(constintr);/ 根据主元变换矩阵的行或列 voidEliminate(constintr);/ 处理消元工作 voidResult()const;/ 计算方程的解 voidCalculate();intGetRank()const;/ 返回矩阵的行数 doubleGetX(consti)const;确定方程组的第 i个解(1<=i<=N)private:/指针a和b分别用于存储方程组的未知数系数和方程"="右边的常数,esp存 / 储精度double*a,*b,esp;/指针flag用于记录方程组解的顺序int*fl
16、ag;/ 以下的结构体用于在全选主元中记录最大主元的位置structcoordinateintrow,column;location;intN;/ 方程组未知数的数目;intmain()intn;doubleesp1;Matrixmatrix;docout<<" 请输入方阵的阶数: "cin>>n;if(n<0)n=0;/ 如何控制非法字符的输入?while(n=0 );docout<<" 请输入计算精度: "cin>>esp1;if(esp1<0)esp1=0;/ 输入不合法的精度就把精度置
17、0while(esp1=0);cout<<" 输入线性方程组的增广矩阵 :n"matrix.SetMatrix(n,esp1);/ 设置矩阵内的 数据matrix.Calculate(); 计算方程组的解/ 输出方程组的解cout<<"nn 方程组的解如下 :n"for(inti=1;i<=matrix.GetRank();+i)cout<<"X"<<i<<":"<<matrix.GetX(i)<<endl;return0;M
18、atrix:Matrix() / 将 Matrix 类的数据成员初始化a=NULL;b=NULL;flag=NULL;location.row=0;location.column=0; esp=0;N=0;Matrix:Matrix()/释放指针a、b和flag指向的内存空间deletea;deleteb;deleteflag;voidMatrix:SetMatrix(constintn,constdoubleesp1)N=n;esp=esp1;a=newdoubleN*N;b=newdoubleN;flag=newintN;/ 判断是否成功分配存储区if(a=NULL|b=NULL|flag
19、=NULL)cout<<" 分配存储区失败! n"exit(EXIT_FAILURE);/ 读取线性方程组的增广矩阵for(inti=0;i<N;+i)for(intj=0;j<N;+j) cin>>*(a+i*N+j);cin>>*(b+i);flag 中/flag 中存储的值对应相应的 x 值,当方程的解由于列变换交换后,/ 的值也相应交换,最后用于恢复解的顺序 for(i=0;i<N;+i) *(flag+i)=i; voidMatrix:Max(constintr)doublemax=0;for(inti=r;i
20、<N;+i)for(intj=r;j<N;+j) if(max<fabs(*(a+i*N+j) max=fabs(*(a+i*N+j);/ 设定最大主元的行、列 location.row=i; location.column=j;/ 最大主元小于输入的精度时,认为方程组无解,退出程序 if(max<=esp)cout<<" 方程组无解! n" exit(EXIT_FAILURE); voidMatrix:ChangeRC(constintr)doubletemp;/ 如果最大主元所在的行不在当前行,则进行行变换 if(location.r
21、ow!=r)for(inti=r;i<N;+i)temp=*(a+r*N+i);(a+r*N+i)=*(a+location.row*N+i);(a+location.row*N+i)=temp;temp=br;br=blocation.row;blocation.row=temp;/若最大主元所在的列不在当前的r列,则进行列变换if(location.column!=r)for(inti=r;i<N;+i)temp=*(a+i*N+r);*(a+i*N+r)=*(a+i*N+location.column); *(a+i*N+location.column)=temp;/交换fl
22、ag中的元素来标记方程解的位置变化inttemp1;temp1=*(flag+r);*(flag+r)=*(flag+location.column);*(flag+location.column)=temp1;voidMatrix:Eliminate(constintr)if(fabs(*(a+N*r+r)<=esp)cout<<" 方程组无解! n"exit(EXIT_FAILURE);for(inti=r+1;i<N;+i)for(intj=r+1;j<N;+j)(*(a+i*N+j)-=(*(a+i*N+r)*(*(a+r*N+j)/(
23、*(a+r*N+r);(*(b+i)-=(*(b+r)*(*(a+i*N+r)/(*(a+r*N+r);voidMatrix:Result()constif(fabs(*(a+N*(N-1)+N-1)<=esp)cout<<" 方程组无解! n"exit(EXIT_FAILURE);doubletemp;*(b+N-1)/=(*(a+N*(N-1)+N-1);/求出 XN-1/ 依次求出 Xi(i=N-2,N-31)for(inti=N-2;i>=0;-i)temp=0;for(intj=i+1;j<N;+j) temp+=(*(a+i*N+j
24、)*(*(b+j);*(b+i)=(*(b+i)-temp)/(*(a+i*N+i);/ 根据 flag 中的数据用冒泡排序法恢复方程组解的次序for(i=0;i<N-1;+i)for(intj=0;j<N-i-1;+j)if(*(flag+j)>*(flag+j+1)inttemp1;/ 交换解的顺序temp=*(b+j);*(b+j)=*(b+j+1);*(b+j+1)=temp;/ 交换用于标记的元素的顺序temp1=*(flag+j);*(flag+j)=*(flag+j+1);*(flag+j+1)=temp1;voidMatrix:Calculate() / 根据
25、矩阵行数重复进行寻找最大主元、变换行或列、消元 for(inti=0;i<GetRank()-1;+i) Max(i);ChangeRC(i);Eliminate(i);Result();intMatrix:GetRank()const returnN;/ 返回矩阵的行数doubleMatrix:GetX(constinti)constreturn*(b+i-1);运行结果追赶法求解方程组的算法:1输入方程组的维数 n ,将主对角元素 b(i)(i=0:n-1) ,主对角元素左边的元素 a(i)(i=0:n-2) ,主对角元素右边的元素 c(i)(i=0:n-2) ,右端项的元素 f(i
26、)(i=0:n- 1)2 .对方程组的系数矩阵作Crout分解,(Q)=b(0),对于i=0:n-2,c(i):= B (i):=c(i)/b(i),b(i+1):= a (i+1):= b(i+1)-a(i)*Ri)3. 解方程组 Ly=fb(0):=y(0):=f(0) /a0):=f(0"b(0)对于 i=1 : n-1 , b(i):=y(i):=f(i)-a(i-1)*y(i-1)/b(i)4.解方程组 Ux=ya(n-1):=x(n-1):=b(n-1)对于 i=n-2:0,a(i)=x(i):=b(i)-c(i)*a(i+1);5输出方程组的解 a(0:n-1) #in
27、clude<iostrea 用追赶法求解方程组的源程序及运行结果 m>#include<stdlib.h>usingnamespacestd;class MatrixThrpublic:MatrixThr();MatrixThr(); voidSetMatrixThr(constintn);/ 设置三对角矩阵的数据 voidResult();/ 计算三对角矩阵的解doubleGetX(constinti)const;取得第 i个解,i从 1 开始intGetN() const;/ 返回未知数的数目private:intN;/N 为未知数的数目/b为矩阵主对角线的元素首地
28、址,a为主对角线左边一斜条元素的首地址, c为主对角线右边一斜条元素首地址,f为方程组的常数首地址 double*a,*b,*c,*f;intmain()MatrixThrmatrix;intn;docout<<" 输入三对角方程组的变量的数目 N:"cin>>n;while(n<3);cout<<" 请依次输入三对角方程组每行的数据 (0元素除 外):n" matrix.SetMatrixThr( n);计算方程组的解matrix.Result();/ 输出方程组的解 cout<<" 方程
29、的解如下 :n"for(inti=1;i<=matrix.GetN();+i) cout<<"X"<<i<<":"<<matrix.GetX(i)<<endl;return0;MatrixThr:MatrixThr() / 初始化相关数据N=0;a=NULL;b=NULL;c=NULL;f=NULL;MatrixThr:MatrixThr() / 释放分配的内存空间deletea;deleteb;deletec;deletef; voidMatrixThr:SetMatrixTh
30、r(constintn) / 根据输入的未知数个数设置矩阵的数据 N=n;a=newdoubleN;b=newdoubleN;c=newdoubleN;f=newdoubleN;/ 若内存分配失败,退出程序if(a=NULL|b=NULL|c=NULL|f=NULL)cout<<" 初始化分配存储空间失败! n"exit(EXIT_FAILURE);/ 依次输入三对角矩阵每行的元素cin>>*b>>*c>>*f;for(inti=1;i<N-1;+i) cin>>*(a+i-1)>>*(b+i)&
31、gt;>*(c+i)>>*(f+i);cin>>*(a+i-1)>>*(b+i)>>*(f+i);voidMatrixThr:Result()/对系数矩阵A作Crout分解for(inti=0;i<N-1;+i) /将U中的a存于指针b中,L中的B存于指针C中*(c+i)/=(*(b+i);*(b+i+1)-=(*(a+i)*(*(c+i);/ 解方程组 Ly=f ,求得的 y 值存于指针 b 中*b=(*f)/(*b);for(i=1;i<N;+i) *(b+i)=(*(f+i)-(*(a+i-1)*(*(b+i-1)/(*(
32、b+i);/解方程组Ux=y ,求得的x值存于指针a中*(a+N-1)=*(b+N-1);for(i=N-2;i>=0;-i)*(a+i)=*(b+i)-(*(c+i)*(*(a+i+1);intMatrixThr:GetN()constreturnN;doubleMatrixThr:GetX(constinti)constreturn*(a+i-1);运行结果#include<iostreaLagrange 插值法的源程序:m>#include<stdlib.h> usingnamespacestd;class Lagrangepublic:Lagrange()
33、;Lagrange();voidSetLagrange(constintn);/ 根据用户的输入设置 Lagrange 类中的插值 点数据boolExist(constdoublex,constinti);检测是否输入了与前i个插值结点横坐标相同的点int GetN()const;/ 获取插值结点的数目 voidCalculate(constdoublea);/计算横坐标a对应的函数值doubleGetResult()const;/ 返回计算的函数值private:intN;/ 插值结点的数目double*x,*y,zx,zy;/x 、y分别用于存储插值点的数据,zx、zy表示所求的坐 标点;
34、intmain()intn=2;LagrangeL;doif(n<2)cout<<" 用于模拟曲线的插值点数目 N>2"<<endl; cout<<" 请输入用于模拟曲线的插值点数目 N:"cin>>n;while(n<2);cout<<" 请输入各插值点横、纵坐标的数据n" L.SetLagrange(n);doublea;cout<<" 请输入所求点的横坐标 X:"cin>>a;L.Calculate(a);对
35、应的函数值为 :"<<L.GetResult()<<endl;cout<<" 横坐标 "<<a<<" return0;Lagrange:Lagrange() / 初始化相关数据N=0;x=y=NULL;zx=zy=0;Lagrange:Lagrange() / 释放分配给指针的内存空间delete x;delete y; boolLagrange:Exist(constdoublea,constinti) / 遍历以输入的插值点,看是否重复插入横坐标相同的插值点 for(intj=0;j<
36、i;+j)if(a=*(x+j)returntrue;returnfalse;voidLagrange:SetLagrange(constintn)N=n;x=newdoubleN;y=newdoubleN;/ 判断是否成功为指针分配了内存空间if(x=NULL|y=NULL)cout<<" 分配存储空间失败! "<<endl; exit(EXIT_FAILURE);/ 输入插值点for(inti=0;i<GetN();+i)cin>>*(x+i)>>*(y+i);/ 如果不是输入第一个坐标值,则会对输入的横坐标进行合法
37、性检测 while(i!=0&&Exist(*(x+i),i)=true)cout<<" 输入了重复的横坐标 请重新输入第 "<<i+1<<" 个插入结点的数据 n"cin>>*(x+i)>>*(y+i);voidLagrange:Calculate(constdoublea)zx=a;for(inti=0;i<GetN();+i) / 计算插值基函数 doubletemp=1; for(intj=0;j<i;+j)temp*=(zx-*(x+j)/(*(x+i)-*
38、(x+j); for(+j;j<GetN();+j)temp*=(zx-*(x+j)/(*(x+i)-*(x+j); zy+=(*(y+i)*temp);intLagrange:GetN()constreturnN;/ 返回插值点的数目doubleLagrange:GetResult()constreturnzy;/ 返回求得的函数值Lagrange 插值法的运行结果#include<iostreaNewton 插值法的源程序:m>usingnamespacestd;class Matrixpublic:Matrix();Matrix();voidSetMatrix(cons
39、tintn);/ 根据用户输入的插值点的数据设置计算结果的 矩阵 intGetN()const;/ 返回插值点的数目 voidCalculate();/ 计算差商 doubleGetResult(doublex)const;/ 根据输入的横坐标求函数值, 返回运算 结果private:double*a,*f;/a和f分别用于存储插值点的横坐标和相应的函数值intN;/ 记录插值点的数目;intmain()Matrixmatrix;intn;docout<<" 输入插值点的数目 N:"cin>>n; while(n<2); cout<<
40、;" 输入插值点的数据: "<<endl; matrix.SetMatrix(n); matrix.Calculate();doublex;cout<<" 输入所求的横坐标: " cin>>x;cout<<" 所求的函数值为: "<<matrix.GetResult(x)<<endl; return1;Matrix:Matrix() / 初始化数据a=f=NULL;N=0;Matrix:Matrix()/释放指针a、f指向的内存空间delete a;delete
41、f;voidMatrix:SetMatrix(intn)N=n;/ 为插值点创建动态数组a=newdoubleN;f=newdoubleN;/ 输入插值点的数据for(inti=0;i<GetN();+i) cin>>*(a+i)>>*(f+i);intMatrix:GetN()constreturnN;voidMatrix:Calculate()/ 将差商存储在一个一维数组内for(inti=0;i<GetN();+i)for(intj=GetN()-1;j>i;-j) *(f+j)=(*(f+j)-*(f+j-1)/(*(a+j)-*(a+j-i-
42、1); doubleMatrix:GetResult(doublex)const/ 利用差商和插值点的横坐标及第一个插值点的纵坐标计算函数值double result=*f;指针f指向第一个插值点的纵坐标for(inti=1;i<GetN();+i)doubletemp=1;for(i ntj=O;j<i;+j)temp*=(x-*(a+j);计算(x-x0)*(x-x1)* *(x-x(i-1) result+=(*(f+i)*temp;/指针(f+i)指向第 i号差商Newton 插值法的运行结果 returnresul t;变步长梯形法求定积分的源程序:#include<
43、;iostream>#include<math.h>using namespacestd;doublefunction(constdoublex);/ 求被积函数的值并返回/accumulate() 为求定积分的函数, a、 b 分别为积分的上下限 ,默认精度为 0.00001 doubleaccumulate(constdoublea,constdoubleb,constdoubleep);intmain()doublea,b,eps;/a,b 分别为定积分的上限和下限 ,h 为步长 ,eps 为要求的精度 a=0; b=1;eps=0.00001;cout<<
44、"(sinX/X) 在 0 到 1上的积分为 :"<<accumulate(a,b)<<endl;return。;doublefu ncti on(con stdoublex)if(x=0)return1;/x 为 0 时函数值为1 return(si n( x)/x);doubleaccumulate(c on stdoublea,c on stdoubleb,c on stdouble eps)intn=1;doubleh=b-a;/h 为步长doubleT仁 h*(fu nctio n(a)+fu nctio n( b)/2;doubleT2=
45、T1/2+h*fu nctio n(a+h/2)/2;/计算结果不满足精度,则继续while(fabs(T2-T1)>eps)n *=2; h/=2;/步长折半T仁 T2;/利用T1计算T2 doubletemp=0;for(i nt i=1;i<=n;+i)temp+=fu ncti on( a+(i-/2)*h); T2=T1/2+h*temp/2;returnT2;/返回步长h最合适时定积分的近似值1 sinx变步长梯形法求定积分的运行结果Romberg 算法求定积分的源程序:#include<iostream>#include<math.h> usi
46、ngnamespacestd;/ 求被积函数的值并返回doublefun(constdoublex);/Romberge() 为求定积分的函数, a、b 分别为积分的上下限 ,默认精度为0.00001 doubleRomberg(constdoublea,constdoubleb,constdoubleep);/函数Tm()为T-数表的计算公式 doubleTm(constdoubleT1,constdoubleT2,constintm); intmain()doublea,b,eps;/a,b分别为定积分的上限和下限,h为步长,eps为要求的精度a=0; b=1;eps=0.00001;co
47、ut<<" 所求积分为 :"<<Romberg(a,b,eps)<<endl;return0;doublefun(constdoublex)if(x=0)return1;/x为 0 时函数值为 1return(sin(x)/x);/ 返回被积函数的值 doubleTm(constdouble T1,constdoubleT2,constintm)/根据T1、T2和m计算出下一个数并返回return(pow(4,m)*T1-T2)/(pow(4,m)-1);doubleRomberg(constdoublea,constdoubleb,co
48、nstdoubleeps)doubleT10;/ 用于存储 T- 数表某一行的数据int l=1;T0=(b-a)*(fun(a)+fun(b)/2;doubleT1,T2;intflag;/flag 用于标记十分求得符合精度的值doflag=0;intn=pow(2,l-1);/n 表示区间等分数 doubleh=(b-a)/n;/h 为步长 doubletemp=0;利用变个数据的差值for(int i=0;i<n;+i)temp+=fun(a+(i+/2)*h); T1=T0/2+h*temp/2;/ 步长梯形公式计算 T- 数表第( l+1 )行的第一个数据/将T-数表第1+1行
49、的前1-1个数据存入数组for(intm=1;m<l;+m)T2=Tm(T1,Tm-1,m); Tm-1=T1;T1=T2;T2=Tm(T1,Tl-1,l);计算T-数表第(1+1 )行的最后一个数据if(fabs(T2-Tl-1)>eps)比较T-数表第(1+1 )行和第i行的最后/将T-数表第1+1行的最后两个个数据存入数组Tl-1=T1;Tl=T2;+l;flag=1;/ 表示没有求得符合精度的值while(flag);returnT2;/ 返回符合精度的解Romberg算法求定积分运行结果第1章绪论数值计算基础课程复习指导1、有效数字、绝对误差、绝对误差限、相对误差、相对误
50、差限的概念;2、有效数字与绝对误差,有效数字与相对误差的关系;3、如何判断有效数字,如何估算绝对误差限与相对误差限。第2章解线性方程组的直接法1、直接法解线性方程组的思想,如何使用高斯消去法、列选主元消去法、全选主元消 去法;2、 直接三角分解法解线性方程组的思想,矩阵的LU分解的条件,如何对矩阵进行LU 分解。如何使用直接三角分解法、平方根法和追赶法法解线性方程组。第3章代数插值法与最小二乘法1、插值的基本概念,插值问题的存在且唯一性;2、如何使用待定系数法、拉格郎日插值法、牛顿插值法构造插值多项式及确定余项;3、Ij(x),(X)的性质及应用;4、差商的定义、性质及应用;5、如何使用分段线
51、性插值及确定余项;5、如何使用待定系数法构造埃尔米特插值多项式及确定余项;6、如何使用曲线拟合的最小二乘法进行线性拟合。(A)2 X10 -3(B)1X 1022、若Ak为矩阵A的k阶主子矩阵,则矩阵A满足()时,则存在唯一单位下三角阵第4章数值积分与数值微分1、机械求积与代数精度的概念,如何判定一个求积公式的代数精度;2、如何通过代数精度法与插值法构造求积公式;3、牛顿-柯特斯公式的定义及构造的方法,牛顿 -柯特斯系数的性质;如何使用梯形公 式、辛卜生公式、柯特斯公式计算定积分及确定余项;4、复化求积法;如何使用复化梯形公式、复化辛卜生公式、复化柯特斯公式计算定积 分及余项;5、变步长求积法的思想,如何使用变步长梯形求积法和龙贝格求积法计算定积分;6、高斯求积公式的定义及构造方法;7、数值微分的数值方法,如何使用二点公式、三点公式计算微分。第5章常微分方程数值解1、常微分方程数值解法的基本思想,欧拉方法、后退欧拉方法、梯形方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人玉器购销合同样本
- 出差安装监控合同标准文本
- 公路权益转让合同样本
- 出售液压设备合同样本
- 第06讲 被子植物的一生 2025年会考生物学专题练习(含答案)
- 2025汽车销售服务合同样本
- 会计管理合同样本
- 2025服装店租赁合同模板
- 佣金合作合同标准文本
- 2025建筑器材租赁合同模板
- 新目标英语初三英语总复习资料讲义
- 体育馆钢结构工程马道施工方案
- DL∕T 1100.1-2018 电力系统的时间同步系统 第1部分:技术规范
- CJ/T 158-2002 城市污水处理厂管道和设备色标
- 2024届山东省潍坊市六年级下学期小升初真题数学试卷含解析
- 2024山东能源集团中级人才库选拔易考易错模拟试题(共500题)试卷后附参考答案
- 输电杆塔用地脚螺栓与螺母条件
- 12清贫 公开课一等奖创新教学设计
- HGT 3652-1999(2009) 快装管接头标准规范
- 《电力建设施工技术规范 第3部分:汽轮发电机组》DLT 5190.3
- 移动互联网环境下用户隐私关注的影响因素及隐私信息扩散规律研究
评论
0/150
提交评论