您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 合肥工业大学-计算机专业-计算方法实验报告
合肥工业大学计算机与信息学院实验报告课程:计算方法专业班级:学号:姓名:Java界面其实都不难按照程序流程图就可以完成了实验一插值与拟合一、实验目的(1)明确插值多项式和分段插值多项式各自的优缺点;(2)编程实现三次样条插值算法,分析实验结果体会高次插值产生的龙格现象;(3)理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法(4)运用常用的插值和拟合方法解决实际问题。二、实验内容(1)对于f(x)=1/(1+x*x)实现三次样条插值(2)实现最小二乘法的直线拟合数据如下:jx165123150123141jy187126172125148三、基本原理(计算公式)(1)三次样条插值在每个内节点上具有2阶导数。(2)最小二乘法拟合直线为y=a+bx,而a,b有如下等式(N为给出的数据点的总个数)iiyxbNa;iiiiyxxbx2a四、算法设计与实现(流程图,关键点)最小二乘法直线拟合:输入数据后,按照公式计算a,b。用得到的拟合直线计算预测点的近似函数值。五、输入与输出(1)三次样条插值输入:区间长度,n+1个数据点,预测点输出:预测点的近似函数值,精确值,及误差(2)最小二乘法直线拟合输入:n个数据点,预测点输出:预测点的近似函数值六、结果讨论和分析代码三次样条插值#includeiostream#includefstream#defineN10usingnamespacestd;doubleu0(doublex){return(x-1)*(x-1)*(2*x+1);}doubleu1(doublex){returnx*x*(3-2*x);}doublev0(doublex){returnx*(x-1)*(x-1);}doublev1(doublex){returnx*x*(x-1);}doubles3(doublex,doubley,doubley1,doublem,doublem1,doubleh){returnu0(x)*y+u1(x)*y1+h*v0(x)*m+h*v1(x)*m1;}doublef(doublex){return1/(1+x*x);}intmain(){ifstreamfin;fin.open(E:\\t.txt);if(!fin){couterroropeninginputstreamendl;system(pause);return0;}doublex[N+1],y[N+1],m[N+1],A[N],B[N],C[N];doubleh[N];doublea[N],b[N];doublef0,fn;doubletemp;inti;for(i=0;i=N;i++){finx[i]y[i];}finf0fn;h[0]=x[1]-x[0];for(i=1;iN;i++){h[i]=x[i+1]-x[i];a[i]=h[i-1]/(h[i-1]+h[i]);b[i]=3*((1-a[i])*(y[i]-y[i-1])/h[i-1]+a[i]*(y[i+1]-y[i])/h[i]);}m[1]=b[1]-(1-a[1])*f0;m[N-1]=b[N-1]-a[N-1]*fn;for(i=2;iN-1;i++){m[i]=b[i];}for(i=1;iN;i++){B[i]=2;C[i]=a[i];}for(i=2;iN;i++){A[i]=1-a[i];}C[1]=C[1]/B[1];m[1]=m[1]/B[1];doublet;for(i=2;i!=N-2;i++){t=B[i]-C[i-1]*A[i];C[i]=C[i]/t;m[i]=(m[i]-m[i-1]*A[i])/t;}m[N-1]=(m[N-1]-m[N-2]*A[N-1])/(B[N-1]-C[N-2]*A[N-1]);for(i=N-2;i0;i--){m[i]=m[i]-C[i]*m[i+1];}coutplease:(输入插值节点在x[0]到x[N]范围内)endl;while(cintemp){doublett=temp;if(tempx[0]||tempx[N]){cout插值节点为tt超出插值范围endl;continue;}for(i=1;i=N;i++){if(tempx[i])break;}temp=(temp-x[i-1])/h[i-1];temp=s3(temp,y[i-1],y[i],m[i-1],m[i],h[i-1]);cout插值节点为tt精确值为f(tt)插值结果为temp误差为f(tt)-tempendl;}system(pause);fin.close();return0;}最小二乘法的直线拟合#includeiostream#includefstream#definen5usingnamespacestd;doublesum(doublex[],intk){inti;doublesum=0;for(i=0;ik;i++)sum=sum+x[i];returnsum;}doublesum2(doublex[],intk){inti;doublesum=0;for(i=0;ik;i++)sum=sum+x[i]*x[i];returnsum;}doublesumxy(doublex[],doubley[],intk){inti;doublesum=0;for(i=0;ik;i++)sum=sum+x[i]*y[i];returnsum;}intmain(){ifstreamfin;fin.open(E:\\t.txt);if(!fin){couterroropeninginputstreamendl;system(pause);return0;}doublex[n],y[n],a,b;doublex0,y0;inti;for(i=0;in;i++){finx[i]y[i];}b=(n*sumxy(x,y,n)-sum(x,n)*sum(y,n))/(n*sum2(x,n)-sum(x,n)*sum(x,n));a=(sum(y,n)-b*sum(x,n))/n;cout最小二乘法直线拟合得到a:a,b:b,拟合直线为y=a+bxendl;cout请输入插值节点x:;while(cinx0){y0=a+b*x0;cout当x=x0,y=y0endl;cout请输入插值节点x:;}system(pause);fin.close();return0;}实验二数值积分一、实验目的(1)熟悉复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法;(2)能编程实现龙贝格算法和中点加速;(3)理解并掌握自适应算法和收敛加速算法的基本思想;(4)分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识二、实验内容(1)用龙贝格算法计算dxxx10sin(2)用中点加速方法计算xe的一阶导数三、基本原理(计算公式)(1)龙贝格算法梯形递推公式10212)(22nkknnxfhTT加权平均公式:nnnSTT1442nnnCSS144222nnnRCC144323(2)中点加速中点公式:G(h)=(f(a+h)-f(a-h))/2/h加权平均:G1(h)=4*G(h/2)/3-G(h)/3G2(h)=16*G1(h/2)/15-G1(h)/15G3(h)=64*G2(h/2)/63-G2(h)/63四、算法设计与实现(流程图,关键点)中点加速:输入数据后根据公式计算导数值五、输入与输出图2.2梯形递推算法流程图图2.3龙贝格算法流程图(1)用龙贝格算法计算dxxx10sin输入:积分区间,误差限输出:序列Tn,Sn,Cn,Rn及积分结果(2)用中点加速方法计算xe的一阶导数输入:求导节点,步长输出:求得的导数值,精确值六、结果讨论和分析代码龙贝格算法#includeiostream#includefstream#includecmathusingnamespacestd;doublef(doublex){if(x==0)return1;returnsin(x)/x;}intmain(){ifstreamfin;fin.open(E:\\t.txt);if(!fin){couterroropeninginputstreamendl;system(pause);return0;}doublea,b,e,t1,t2,s1,s2,c1,c2,r1,r2;doublex,h,s;finabe;cout积分区间为[a,b],要求精度为eendl;coutkT2S2C2R2endl;h=b-a;t1=(f(a)+f(b))*h/2;cout0t1endl;intk;for(k=1;k=10;k++,h=h/2,t1=t2,s1=s2){s=0;x=a+h/2;do{s=s+f(x);x=x+h;}while(xb);t2=t1/2+h*s/2;s2=t2+(t2-t1)/3;if(k==1){coutkt2s2endl;continue;}c2=s2+(s2-s1)/15;if(k==2){coutkt2s2c2endl;c1=c2;continue;}r2=c2+(c2-c1)/63;coutkt2s2c2r2endl;if(k==3){r1=r2;c1=c2;continue;}if(fabs(r2-r1)e){cout数值积分结果为r2endl;break;}r1=r2;c1=c2;}system(pause);return0;}中点加速算法#includeiostream#includefstream#includecmathusingnamespacestd;doublef(doublex){returnexp(x);}doublef1(doublex){returnexp(x);}doubleg(doublex,doubleh){return(f(x+h)-f(x-h))/2/h;}doubleg1(doublex,doubleh){return4*g(x,h/2)/3-g(x,h)/3;}doubleg2(doublex,doubleh){return16*g1(x,h/2)/15-g1(x,h)/15;}doubleg3(doublex,doubleh){return64*g2(x,h/2)/63-g2(x,h)/63;}intmain(){ifstreamfin;fin.open(E:\\t.txt);if(!fin){couterroropeninginputstreamendl;system(pause);return0;}doublea,h;while(finah)cout当x=a,步长h=h,x处一阶导数值精确值为f1(a),中点加速求得x处一阶导数值为g3(a,h),误差为f1(a)-g3(a,h)endl;system(pause);fin.close();return0;}实验三非线性方程求根迭代法一、实验目的(1)熟悉非线性方程求根简单迭代法,牛顿迭代及牛顿下山法(2)能编程实现牛顿下山法(3)认识选择迭代格式的重要性(4)对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响二、实验内容用牛顿下山法解方程013xx(初值为0.6)三、基本原理(计算公式)求非线性方程组的解是科学计算常遇到的问题,
本文标题:合肥工业大学-计算机专业-计算方法实验报告
链接地址:https://www.777doc.com/doc-4238973 .html