数值实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

北京XX大学计算机与通信工程学院实验报告实验名称:《数值计算方法》课程实验学生姓名:_____________XX_______________专业:________计算机科学与技术________班级:_____________XXXX____________学号:_____________XXXXXX___________指导教师:_____________XXXXX_____________实验成绩:________________________________实验地点:__________XXXXXXX____________实验时间:____2017____年___6___月___6___日一、实验目的与实验要求1、实验目的实验1:探究非线性方程的解法,比较不同解法的优劣性,针对具体问题对解法进行实践,并迭代达到指定的精确度。实验2:探究一般化曲线拟合的方法,采用最小二乘法对含有多项式,指数和对数多种形式的函数进行拟合,确定拟合结果中的系数。实验3:探究多种积分的数值解法,根据给定的精度,选择恰当的数值积分方法,确定迭代步数与步长,分析积分数值解法的优劣性。2、实验要求实验1:采用两种算法求解非线性方程,比较两种算法的性能。实验2:用最小二乘法拟合由不超过三阶多项式和指数、对数函数线性组合成的符合函数,确定各个项的系数实验3:自选一种数值积分方法求解积分值,根据要求的精度给出最终的迭代步数和步长,分析优缺点。二、实验设备(环境)及要求实验1,3采用C语言编写,编译环境为DEVC++。实验2涉及矩阵操作,故采用MATLAB编写。三、实验内容与步骤1、实验1(1)实验内容·采用至少两种不同的算法求解ex+3*x3-x2-2=0在[0,1]范围内的一个根,要求两次迭代误差小于10-4。·根据实验结果,比较分析不同算法的性能。(2)主要步骤本实验由C语言实现。在两种不同的算法上选用简单迭代法和牛顿迭代法。简单迭代法是将方程化成一个与原方程同解的方程,方程一端化成自变量x,然后判断迭代函数是否收敛,如果收敛的话,不停地迭代将使x趋于一个定值,这个定值就是原方程的近似解。而牛顿迭代法是直接给出形如𝑥𝑘+1=𝑥𝑘−𝑓(𝑥𝑘)𝑓`(𝑥𝑘)的迭代函数进行迭代,如果满足两个端点异号,f’(x)在[a,b]上不等于零,f’’(x)在[a,b]上不变号且初值𝑥0满足条件f(𝑥0)f’’(𝑥0)≥0,则由牛顿迭代法产生的序列单调收敛于[a,b]内的唯一根。两种算法在理论上,牛顿迭代法的收敛速度要大于简单迭代法,以下进行迭代解非线性方程组并验证收敛速度的差异。1.简单迭代法:将𝑥3移项,整理,得到迭代函数如下:x=√−𝑒𝑥+𝑥2+233,选取收敛的初值点𝑥0=0。在实现上利用for循环进行迭代,直到相邻两次的误差小于10−4。C语言代码如下:简单迭代函数:floatSimpleIteration(floatx)//简单迭代{returnpow((x*x+2-exp(x))/3.0,1.0/3);//pow(doublex,doubley);函数为求x的y次方}主函数中简单迭代法部分:a[0]=SimpleIteration(0);//简单迭代法printf(简单迭代法:\n);printf(迭代值\t\t相邻两次误差\n);printf(%f\n,a[0]);for(i=1;;i++){a[i]=SimpleIteration(a[i-1]);d1=fabs(a[i]-a[i-1]);printf(%f\t%f\n,a[i],d1);if(d11e-4)break;}2.牛顿迭代法:根据牛顿迭代法迭代函数的一般形式可以得到具体的迭代函数如下:x−𝑒𝑥+3𝑥3−𝑥2−2𝑒𝑥+9𝑥2−2𝑥,选取与简单迭代法相同的初值𝑥0=0。C语言代码如下:牛顿迭代函数:floatNewtonIteration(floatx)//牛顿迭代{returnx-(exp(x)+3*x*x*x-x*x-2)/(exp(x)+9*x*x-2*x);}主函数中牛顿迭代法的部分:b[0]=NewtonIteration(0);//牛顿迭代法printf(\n牛顿迭代法:\n);printf(迭代值\t\t相邻两次误差\n);printf(%f\n,b[0]);for(j=1;;j++){b[j]=NewtonIteration(b[j-1]);d2=fabs(b[j]-b[j-1]);printf(%f\t%f\n,b[j],d2);if(d21e-4)break;}两个迭代法完整C语言代码如下:#includestdio.h#includemath.h#includestdlib.h#defineMAXSIZE30floatSimpleIteration(floatx)//简单迭代{returnpow((x*x+2-exp(x))/3.0,1.0/3);//pow(doublex,doubley);函数为求x的y次方}floatNewtonIteration(floatx)//牛顿迭代{returnx-(exp(x)+3*x*x*x-x*x-2)/(exp(x)+9*x*x-2*x);}voidmain(){floata[MAXSIZE];floatb[MAXSIZE];floatd1=1;floatd2=1;inti,j;a[0]=SimpleIteration(0);//简单迭代法printf(简单迭代法:\n);printf(迭代值\t\t相邻两次误差\n);printf(%f\n,a[0]);for(i=1;;i++){a[i]=SimpleIteration(a[i-1]);d1=fabs(a[i]-a[i-1]);printf(%f\t%f\n,a[i],d1);if(d11e-4)break;}b[0]=NewtonIteration(0);//牛顿迭代法printf(\n牛顿迭代法:\n);printf(迭代值\t\t相邻两次误差\n);printf(%f\n,b[0]);for(j=1;;j++){b[j]=NewtonIteration(b[j-1]);d2=fabs(b[j]-b[j-1]);printf(%f\t%f\n,b[j],d2);if(d21e-4)break;}}执行程序,结果如下:可见,牛顿迭代法的收敛速度大于简单迭代法,具体详见实验结果与分析。2、实验2(1)实验内容·已知如下数据:x:1.00001.40001.80002.20002.60003.00003.40003.80004.20004.60005.0000y:2.71836.644815.366730.186752.654284.5925128.1972186.2022262.1349360.7020488.3660·数据可能来自于不超过3阶多项式和指数、对数函数线性组合形成的复合函数([1,x,x2,x3,ex,ln(x)]),请采用最小二乘算法确定复合函数中各个函数项的系数。(2)主要步骤最小二乘法是在确定函数形式的情况下,找出一条最靠近所有数据点的直线,其判定规则是∑𝑤𝑖𝛿𝑖2𝑚𝑖=0达到最小。在求解的过程中,用最小二乘法拟合复合函数的过程实际上就是求法方程组的过程。分别写出各项的内积(φ𝑗,φ𝑘)和(f,φ𝑘)然后求解方程组[(φ0,φ0)⋯(φ0,φ𝑛)⋮⋱⋮(φ𝑛,φ0)⋯(φ𝑛,φ𝑛)][𝑎0⋮𝑎𝑛]=[(f,φ0)⋮(f,φ𝑛)]根据题目中给出的数据点和复合函数形式,可以定义出如下的6种基函数,具体的MATLAB代码如下:functiony=f(x,n)ifn==1y=1;endifn==2y=x;endifn==3y=x.^2;endifn==4y=x.^3;endifn==5y=exp(x);endifn==6y=log(x);endend然后在M命令文件中调用上述函数,并输入相应的n。整个法方程组的系数矩阵可以用一个三重for循环实现,等号右侧的矩阵用另一个二重循环实现,实现系数矩阵的MATLAB代码如下:fork=1:6%ؖ控制行fori=1:6%ؖ控制列forj=1:11%ؖ控制所有元素求和D(k,i)=f(X(j),k).*f(X(j),i)+D(k,i);endendend等式右边的矩阵的MATLAB代码如下:forl=1:6%ؖ控制行form=1:11%ؖ控制所有元素求和F(l)=f(X(m),l).*Y(m)+F(l);endend完整的MATLAB代码如下:functiona=LS()clcclearformatshortX=[11.41.82.22.633.43.84.24.65];%11个元素Y=[2.71836.644815.366730.186752.654284.5925128.1972186.2022262.1349360.7020488.3660];D=zeros(6);F=zeros(1,6)';a=[];fork=1:6fori=1:6forj=1:11D(k,i)=f(X(j),k).*f(X(j),i)+D(k,i);endendendforl=1:6form=1:11F(l)=f(X(m),l).*Y(m)+F(l);endenda=D\F%ؖ求解end得出的结果如下:a=-2.00060.0006-1.00003.00001.0000-5.0008所以,拟合出的复合函数应为f(x)=−2.0006+0.0006x−1x2+3𝑥3+𝑒𝑥−5.0008ln⁡(𝑥)3、实验3(1)实验内容·选择一种数值积分方法求解下列函数在区间[0,2]内的积分值,要求精度小于10-5:f(x)=(3x-x2+x3+ex)0.5·给出迭代步数和最终的步长,并分析你所采用方法的优缺点。(2)主要步骤在积分难求出解析解时通常用数值解的方法求积分结果的近似值,在本题的实现方法上选用复合Simpson公式进行数值积分的计算,并从步数n=2,步长h=12开始逐步细化步长,增大步数,直到精度满足题目中的要求10−5。首先在定义一个题目中给出的待积分的函数,C语言代码如下:doublefunction(doublex){doubles;s=sqrt(3*x-x*x+x*x*x+exp(x));returns;}然后编写复合Simpson公式,将其定义在一个独立的函数中,C代码如下:doubleReiterationOfSimpson(doublea,doubleb,doublen,doublef(doublex)){doubleh,fa,fb,xk,xj;h=(b-a)/n;fa=f(a);fb=f(b);doubles1=0.0;doubles2=0.0;intk,j;for(k=1;kn;k++){xk=a+k*h;s1=s1+f(xk);}for(j=0;jn;j++){xj=a+(j+0.5)*h;s2=s2+f(xj);}doublesn;sn=h/6*(fa+fb+2*s1+4*s2);returnsn;}最后在主函数中定义初始步数n为2,初始步长h为0.5,并通过for循环逐步增大n,直到相邻两次误差小于10−5,具体的C代码如下:voidmain(){doublen=2;doubleh=1/n;inti;doubleS[MAXN];printf(====================复合Simpson公式法=====================\n\n);printf(迭代步数\t步长\t\t积分数值\t误差\n);S[0]=ReiterationOfSimpson(0,2,n,function);printf(%d\t\t%f\t%f\n,(int)n,h,S[0]);n++;h=1/n;S[1]=ReiterationOfSimpson(0,2,n,function);printf(%d

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功