合肥工业大学 计算机专业 计算方法实验报告

  • 格式:doc
  • 大小:825.00 KB
  • 文档页数:33

. . 合肥工业大学

计算机与信息学院 实验报告

课 程:计算方法 专业班级: 学 号: 姓 名: .

. Java界面 其实都不难按照程序流程图就可以完成了 .

. 实验一 插值与拟合 一、实验目的 (1) 明确插值多项式和分段插值多项式各自的优缺点; (2) 编程实现三次样条插值算法,分析实验结果体会高次插值产生的龙格现象; (3) 理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法 (4) 运用常用的插值和拟合方法解决实际问题。

二、实验内容 (1)对于f(x)=1/(1+x*x)实现三次样条插值 (2)实现最小二乘法的直线拟合 数据如下:

jx 165 123 150 123 141

jy 187 126 172 125 148

三、基本原理(计算公式) (1)三次样条插值在每个内节点上具有2阶导数。 (2)最小二乘法拟合直线为y=a+bx,而a,b有如下等式(N为给出的数据点的总个数)

iiyxbNa ; iiiiyxxbx2a

四、算法设计与实现(流程图,关键点) .

. 最小二乘法直线拟合:输入数据后,按照公式计算a,b。用得到的拟合直线计算预测点的近似函数值。

五、输入与输出 (1)三次样条插值 输入:区间长度,n+1个数据点,预测点 输出:预测点的近似函数值,精确值,及误差 (2)最小二乘法直线拟合 输入:n个数据点,预测点 输出:预测点的近似函数值

六、结果讨论和分析 .

. 代码 三次样条插值 #include #include #define N 10 using namespace std; double u0(double x){ return (x-1)*(x-1)*(2*x+1); } double u1(double x){ return x*x*(3-2*x); } double v0(double x){ return x*(x-1)*(x-1); } double v1(double x){ return x*x*(x-1); } double s3(double x,double y,double y1,double m,double m1,double h){ return u0(x)*y+u1(x)*y1+h*v0(x)*m+h*v1(x)*m1; } double f(double x){ return 1/(1+x*x); } int main(){ ifstream fin; . . fin.open("E:\\t.txt"); if(!fin){ cout<<"error opening input stream"

double x[N+1],y[N+1],m[N+1],A[N],B[N],C[N]; double h[N]; double a[N],b[N]; double f0,fn; double temp; int i; for(i=0;i<=N;i++){ fin>>x[i]>>y[i]; } fin>>f0>>fn; h[0]=x[1]-x[0]; for(i=1;ih[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;im[i]=b[i]; } for(i=1;iB[i]=2; C[i]=a[i]; } for(i=2;iA[i]=1-a[i]; } C[1]=C[1]/B[1]; m[1]=m[1]/B[1]; double t; 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;i>0;i--){ m[i]=m[i]-C[i]*m[i+1]; } cout<<"please:(输入插值节点在">temp){

double tt=temp; if(tempx[N]){ cout<<"插值节点为">x[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: ">x0){ y0=a+b*x0; cout<<"当x="

实验二 数值积分 一、实验目的 (1) 熟悉复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法; (2) 能编程实现龙贝格算法和中点加速; (3) 理解并掌握自适应算法和收敛加速算法的基本思想; (4) 分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识 . . 二、实验内容 (1)用龙贝格算法计算dxxx10sin (2)用中点加速方法计算xe的一阶导数

三、基本原理(计算公式) (1)龙贝格算法 梯形递推公式10212)(22nkknnxfhTT

加权平均公式:nnnSTT1442 nnnCSS144222 nnnRCC144323 (2)中点加速 中点公式: G(h)=(f(a+h)-f(a-h))/2/h 加权平均:G1(h)=4*G(h/2)/3-G(h)/3 G2(h)=16*G1(h/2)/15-G1(h)/15 G3(h)=64*G2(h/2)/63-G2(h)/63

四、算法设计与实现(流程图,关键点) 中点加速:输入数据后根据公式计算导数值

五、输入与输出 图2.2梯形递推算法流程图 图2.3龙贝格算法流程图