第一篇:计算方法上机实验
龙格-库塔
#include
#include
float function(float x,float y)
{
return(0-(y*y));//f(x,y)µÄ±í´ïʽ }
int main()
{
float x0,x1,y0,y1,k1,k2,k3,k4,a,b,c,n,h;int i;
scanf(“%f %f %f %f”,&a,&b,&c,&n);x0=a;
y0=c;
h=(b-a)/n;
for(i=1;i<=n;i++)
{
k1=h*function(x0,y0);
k2=h*function(x0+h/2,y0+k1/2);k3=h*function(x0+h/2,y0+k2/2);k4=h*function(x0+h,y0+k3);x1=x0+h;
y1=y0+(k1+2*k2+2*k3+k4)/6;
printf(“x%d=%f,y%d=%fn”,i,x1,i,y1);x0=x1;
y0=y1;
}
return 0;
}
拉格朗日
#include
#include
#include
#define maxlength 500
#define pi 3.14***
floata[maxlength],f[maxlength];
float n;
floatlagrange(floata[],floatf[],float x,int n)
{
int k=0,j;
floaty=0.0,l;
while(k<=n)
{
l=1.0;
// printf(“%lfn”,y);
for(j=0;j<=n;j++)
{
if(j!=k)
{
l=l*(x-a[j])/(a[k]-a[j]);// printf(“%lfn”,l);
}
}
//printf(“%lfn”,f[k]);
// printf(“%lfn”,l);
y=y+l*f[k];
k++;
}
printf(“x=%f,y=%fn”,x,y);
return y;
}
float fx1(floatx)
{
return(1/(1+x*x));
}
floatfx2(floatx)
{
return exp(x);
}
floatfx3(float x)
{
return sqrt(x);
}
void math1(float c,float n)
{
int i=0;
float h;
h=2*c/n;
while(i<=n)
{
a[i]=i*h-5;
i++;
}
}
void math2()
{
int i=0;
while(i<=n)
{
a[i]=cos((2*i+1)*pi/2/(n+1));
i++;
}
}
int main()
{
n=20;
int i;
math1(5,n);
for(i=0;i<=n;i++)
{
f[i]=fx1(a[i])
}
lagrange(a,f,0.75,n);
return 0;
}
龙贝格
#include
#include
#include
double t[1000],r[1000];
double f(double x)
{
return(x*x*exp(x));
}
int main()
{
double h,a,b,e;
int i,N,m;
scanf(“%lf,%lf,%d,%lf”,&a,&b,&N,&e);
h=b-a;
m=0;
t[1]=0.5*h*(f(a)+f(b));
printf(“%lf”,t[1]);
r[0]=t[0];
while(1)
{
printf(“n”);
for(i=0;i<((m<4)?m:4);i++)
t[i]=r[i];
m++;
h=h/2;
r[0]=t[0]/2;
for(i=1;i<=pow(2,m);i++)
r[0]+=h*f(a+(i-0.5)*h)/2;
printf(“%lf”,r[0]);
r[1]=(4*r[0]-t[0])/3;
printf(“ %lf”,r[1]);
if(m==1)
continue;
r[2]=(16*r[1]-t[1])/15;
printf(“ %lf”,r[2]);
if(m==2)
continue;
r[3]=(64*r[2]-t[2])/63;
printf(“ %lf”,r[3]);
if(m==3)
continue;
if((fabs(r[3]-t[3])<=e)||(m==N))
break;
}
printf(“nthe current time is :%dn”,m);
return 0;
}
牛顿
#include
#include
#include
double function(double point)
{
return(point*point-2*point*exp(-point)+exp(-2*point));
}
double d_function(double point)
{
return(2*point+2*point*exp(-point)-2*exp(-point)-2*exp(-2*point));}
int main()
{
double beginner,error1,error2;
int max_times=0;
beginner=error1=error2=0;
scanf(“%lf %lf %lf %d”,&beginner,&error1,&error2,&max_times);int current_times=0;
while(current_times<=max_times)
{
if(fabs(function(beginner)) { printf(“%lfn”,beginner); return 0; } if(fabs(d_function(beginner)) { printf(“failuren”); return 0; } beginner=beginner-function(beginner)/d_function(beginner);if(fabs(function(beginner)/d_function(beginner)) printf(“%lfn”,beginner); return 0; } current_times++; } printf(“failuren”); return 0; } 计算方法与实习 ——上机报告 学院:电子工程学院 2015.1.4 学号:*** 姓名: 刘 波 习题一: 舍入误差及稳定性 一、实验目的 (1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性 二、实验内容 21、用两种不同的顺序计算n,分析其误差的变化 n1100002、已知连分数fb0a1,利用下面的算法计算f: b1a2/b2a3/(...an/bn)ai 1(in1,n2,..., 0fd0 di1写一程序,读入n,b0,b1,...,bn,a1,...,an,计算并打印f dnbn,dibi 3、给出一个有效的算法和一个无效的算法计算积分 xnyndx (n0,1,..., 104x1N11311 4、设SN2,已知其精确值为 22NN1j2j1(1)编制按从大到小的顺序计算SN的程序 1(2)编制按从小到大的顺序计算SN的程序 (3)按两种顺序分别计算S1000,S10000,S30000,并指出有效位数 三、实验步骤、程序设计、实验结果及分析 21、用两种不同的顺序计算n,分析其误差的变化 n110000(1)实验步骤: 分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h和math.h(2)程序设计: a.顺序计算 #include sum=sum+(1/pow(n,2)); if(n%1000==0)printf(“sun[%d]=%-30f”,n,sum); if(n>=10000)break; n++;} printf(“sum[%d]=%fn”,n,sum);} b.逆序计算 #include while(n!=0){ sum=sum+(1/pow(n,2)); if(n%200==0) printf(“sum[%d]=%-10f”,n,sum); if(n<1)break; n--;} printf(“sum[%d]=%fn”,n,sum);} (3)实验结果及分析: 程序运行结果: a.顺序计算 b.逆序计算 结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。 2、已知连分数fb0(1)实验步骤: 利用 dnbn,dibia1,计算f: b1a2/b2a3/(...an/bn)ai1,0 (in1,n2,...,fd0,计算f di1(2)程序设计 #include printf(“nplease input a[0] to a[n-1]:n”);for(i=1;i printf(“a[%d]=”,i); scanf(“%f”,&a[i]);} printf(“nplease input b[0] to b[n-1]:n”);for(i=0;i printf(“b[%d]=”,i); scanf(“%f”,&b[i]);} d[n]=b[n];for(i=n-1;i>=0;i--) c[i]=b[i]+a[i+1]/c[i+1];printf(“nf=%fn”,c[0]);}(3)实验结果 程序运行结果: 3、给出一个有效的算法和一个无效的算法计算积分 xnyndx (n0,1,..., 104x11(1)实验步骤 利用C语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。 (2)程序设计 #include y_1=1.0/(4*n)+y_0/(-4.0); printf(“y[%d]=%-20f”,n,y_1); if(n>=10)break; y_0=y_1; n++; if(n%3==0)printf(“n”);} printf(“n无效算法的输出结果:n”);printf(“y[10]=%-20f”,y_2);while(1){ y_3=1.0/n-4.0*y_2; printf(“y[%d]=%-20f”,m-1,y_3); if(m<=1)break; y_2=y_3; m--; if(m%2==0)printf(“n”);} }(3)实验结果及分析 程序运行结果: 结果分析:无效算法数值不稳定,误差造成的影响特别大 4、设SN j2N11311,已知其精确值为 22NN1j21(1)实验步骤 先编程按从大到小的顺序计算SN的程序,再编程按从小到大的顺序计算SN的程序,然后按两种顺序分别计算S1000,S10000,S30000。(2)程序设计 #include int N;double SN[30000];SN[30000]=(3.0/2.0-1.0/30000.0-1/30001.0)/2.0; for(N=30000;N>=2;N--) SN[N-1]=SN[N]-1.0/(N*N-1);printf(“从大到小顺序计算nSN[1000]=%fnSN[10000]=%fnSN[30000]=%fn”,SN[1000],SN[10000],SN[30000]); SN[2]=(3.0/2-1.0/2.0-1/3.0)/2.0;for(N=3;N<=30000;N++) SN[N]=SN[N-1]+1.0/(N*N-1);printf(“从小到大顺序计算nSN[1000]=%fnSN[10000]=%fnSN[30000]=%fn”,SN[1000],SN[10000],SN[30000]);}(3)实验结果及分析 程序运行结果: : : 结果分析:不同顺序计算所得结果是一样的。 四、总结 通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。 习题二: 一、实验目的 (1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。 (2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。 二、实验内容 1、用牛顿法求下列方程的根(1)xe0 (2)xe10(3)lgxx20 2、编写割线法程序求解第一问的方程 三、实验步骤、程序设计、实验结果及分析 1、牛顿法(1)实验步骤 通过定义牛顿法求方程的子函数,用main函数调用子函数求根(2)程序设计 #include float ff1(float x){ return x*x-exp(x);} x2xfloat ff2(float x){ return x*exp(x)-1;} float ff3(float x){ return log(x)+x-2;} float answer(float(*p)(float)){ int k=2; float m=1,n=-1,x2,a,b,c; if(p==ff3)n=2; printf(“x[0] = %.4f, x[1] = %.4f, ”,m,n); while(1) { if(fabs(m-n)<1e-4)break; a=p(n)*(n-m); b=p(n)-p(m); c=a/b; x2=n-c; m = n; n = x2; printf(“x[%d] = %.4f, ”,k,x2); k++; if(k%3==0)printf(“n”); } if(k%3!=0)printf(“n”); printf(“iteration times: %d, roots: %.4fn ”,k-2,n);return 0;} main(){ printf(“x*x-exp(x),n”);answer(ff1);printf(“x*exp(x)-1,n”);answer(ff2);printf(“lg(x)+x-2,n”);answer(ff3);return 0;}(3)实验结果及分析 2、割线法(1)程序设计 #include int i,j; float x1=2.2; float x2=2,x3; scanf(“%d”,&i); if(i==1)printf(“%f”,x1); else if(i==2)printf(“%f”,x2); else { for(j=3;j<=i;j++) { x3=gexian(x1,x2); x1=x2; x2=x3; } printf(“%f”,gexian(x1,x2)); } } float f(float x){ return(x*x-exp(x));} float gexian(float x1,float x2){ return(x2-(f(x2)/(f(x2)-f(x1)))*(x2-x1));}(3)实验结果及分析 四、总结 了解和学习了二分法和牛顿迭代法的思想以及程序设计的方法,比较了迭代法和牛顿法的特点:牛顿法收敛速度较快,但对初值选取要求较高;割线法计算量少。 习题三: 线性方程组数值解法 一、实验目的 (1)熟悉求解线性方程组的有关理论和方法; (2)会编制列主元消去法,LU分解法,雅可比及高斯-赛德尔迭代法的程序;(3)通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。 二、实验内容 1、用列主元消去法解方程组 2、用LU分解法解方程组 三、实验步骤、程序设计、实验结果及分析 1、用列主元消去法解方程组(1)程序设计 #include k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++) *(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} } void main(){ int i;float x[4];float c[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4}; ColPivot(c[0],4,x);for(i=0;i<=3;i++) printf(“x[%d]=%fn”,i,x[i]);}(2)实验结果及分析 (1)题 (2)题 2、用LU分解法解方程组(1)程序设计 #include for(i=r;r<=n;i++) for(k=0;k<=r-1;k++) *(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i)); for(i=r+1;i<=n-1;i++) { for(k=0;k<=r-1;k++) *(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r)); *(u+i*(n+1)+r)/=*(u+r*(n+1)+r); } } for(i=n-1;i>=0;i--){ for(r=n-1;r>=i+1;r--) *(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r]; x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i));} } 四、总结 掌握了用列主元消去法和LU分解法求解方程组程序编写的技巧。 习题四: 插值法 一、实验目的 (1)熟悉拉格朗日插值法多项式和牛顿插值多项式,注意其不同点;(2)掌握三次样条插值解决一些实际问题。 二、实验内容 1、按所给数据做二次插值,并求给定点的函数值 2、按所给数据做五次插值,并求给定点的函数值 3、牛顿前插公式计算函数值 三、实验步骤、程序设计、实验结果及分析 1、二次插值(1)程序设计 #include //n为(n+1)次插值; { int i,j;float *a,yy=0; a=new float[n];for(i=0;i<=n-1;i++){ a[i]=y[i]; for(j=0;j<=n-1;j++) if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i];} delete a;return yy;} void main(){ float x[5]={-3.0,-1.0,1.0,2.0,3.0};float y[5]={1.0,1.5,2.0,2.0,1.0};float xx1=-2,xx2=0,xx3=2.75,yy1,yy2,yy3;yy1=Lagrange(x,y,xx1,3);yy2=Lagrange(x,y,xx2,3);yy3=Lagrange(x,y,xx3,3);printf(“x1=%-20f,y1=%fn”,xx1,yy1);printf(“x2=%-20f,y2=%fn”,xx2,yy2);printf(“x3=%-20f,y3=%fn”,xx3,yy3);}(2)实验结果 2、五次插值(1)程序设计 #include //n为(n+1)次插值; { int i,j;float *a,yy=0; a=new float[n];for(i=0;i<=n-1;i++){ a[i]=y[i]; for(j=0;j<=n-1;j++) if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i];} delete a;return yy;} void main(){ float x[6]={0.30,0.42,0.50,0.58,0.66,0.72};float y[6]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};float xx1=0.46,xx2=0.55,xx3=0.60,yy1,yy2,yy3;yy1=Lagrange(x,y,xx1,6);yy2=Lagrange(x,y,xx2,6); yy3=Lagrange(x,y,xx3,6);printf(“x1=%-20f,y1=%fn”,xx1,yy1);printf(“x2=%-20f,y2=%fn”,xx2,yy2);printf(“x3=%-20f,y3=%fn”,xx3,yy3);} (2)实验结果 3、牛顿前插公式计算函数值(1)程序设计 #include int k,i;f[0][0]=y[0];f[1][0]=y[1];f[2][0]=y[2];f[3][0]=y[3];for(k=1;k<=n;k++) for(i=0;i<=(N-k);i++) f[i][k]=f[i+1][k-1]-f[i][k-1];return;} void main(){ int i,k=1;float a,b=1,m=21.4,t=1.4,f[4][4]={0};float x[5]={20,21,22,23,24};float y[5]={1.30103,1.32222,1.34242,1.36173,1.38021};Difference(y,f,N);a=f[0][0];for(i=1;i<=N;i++){ k=k*i; b=b*(t-i+1); a=a+b*f[0][i]/k;} printf(“x(k)n”);for(i=0;i<=4;i++) printf(“%-20f”,x[i]);printf(“ny(k)n”); for(i=0;i<=4;i++) printf(“%-20f”,y[i]);for(k=1;k<=3;k++){ printf(“nF(%d)n ”,k); for(i=0;i<=(3-k);i++) { printf(“%-20f”,f[i][k]); } } printf(“n”);printf(“f(%f)=%-20f”,m,a);printf(“n”);}(2)实验结果 四、总结 学习了插值法,学会了利用插值法编程求多项式的解,可以求解很多问题,让求解多项式解变得非常简单。 习题五: 曲线拟合 一、实验目的 (1)了解最小二乘法的基本原理,通过计算机解决实际问题;(2)了解超定方程组的最小二乘解法。 二、实验内容 1、分别用抛物线yabxcx2和指数曲线yaebx拟合所给数据,并比较这两个拟合函数的优劣。 2、按所给实验数据,用形如yabx的抛物线进行最小二乘拟合。 三、程序设计、结果分析 1、分别用抛物线yabxcx和指数曲线yae拟合所给数据 a.抛物线 (1)程序设计: #include 2bx2 float y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310.40,318.15,325.15};void Approx(float[],float[],int,int,float[]);Approx(x,y,15,2,a);for(i=0;i<=2;i++) printf(“a[%d]=%fn”,i,a[i]);} void Approx(float x[],float y[],int m,int n,float a[]){ int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;i<=n;i++){ for(j=0;j<=n;j++) { *(c+i*(n+2)+j)=0; for(t=0;t<=m-1;t++) *(c+i*(n+2)+j)+=power(i+j,x[t]); } *(c+i*(n+2)+n+1)=0; for(j=0;j<=m-1;j++) *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);} ColPivot(c,n+1,a);delete c;} void ColPivot(float *c,int n,float x[]){ int i,j,t,k;float p;for(i=0;i<=n-2;i++){ k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} } float power(int i,float v){ float a=1;while(i--)a*=v;return a;}(2)实验结果 2、最小二乘拟合(1)程序设计 #include //增加了数组z; {z[n]=log(y[n]/x[n]);} void Approx(float[],float[],int,int,float[]);Approx(x,z,15,1,a); //变成一次拟合; //for(i=0;i<=1;i++) //printf(“a[%d]=%fn”,i,a[i]);printf(“a=exp(a[0])=%fn”,exp(a[0]));printf(“b=-a[1]=%fn”,-a[1]);} void Approx(float x[],float y[],int m,int n,float a[]){ int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;i<=n;i++){ for(j=0;j<=n;j++) { *(c+i*(n+2)+j)=0; for(t=0;t<=m-1;t++) *(c+i*(n+2)+j)+=power(i+j,x[t]); } *(c+i*(n+2)+n+1)=0; for(j=0;j<=m-1;j++) *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);} ColPivot(c,n+1,a);delete c;} void ColPivot(float *c,int n,float x[]){ int i,j,t,k;float p;for(i=0;i<=n-2;i++){ k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} } float power(int i,float v){ float a=1;while(i--)a*=v;return a;}(2)实验结果 四、总结 通过曲线拟合,最小二乘法的基本原理的学习,我学会了利用计算机解决现实实际问题中的曲线拟合。 习题六: 数值积分 一、实验目的 (1)通过实际计算体会各种方法的精确度;(2)会编写用龙贝格算法求定积分的程序。 二、实验内容 编写复化柯特斯求积分公式,并计算例题1例题2,观察n为多少时有6位有效数字。 三、程序设计、实验结果及分析(1)程序设计 #include c1+=(*f)(a+k*h); c2+=(*f)(a+k*h+h/4); c3+=(*f)(a+k*h+h/2); c4+=(*f)(a+k*h+3*h/4);} c=h/90*(7*((*f)(a)+(*f)(b))+14*c1+32*c2+12*c3+32*c4);return c;} float f(float x){ return 1/sqrt(1+x*x*x);} void main(){ int i,n=4;float c;for(i=0;i<=4;i++){ c=Cotes(f,0,1,n); printf(“C(%d)=%fn”,n,c); n*=2;} } #include c1+=(*f)(a+k*h); c2+=(*f)(a+k*h+h/4); c3+=(*f)(a+k*h+h/2); c4+=(*f)(a+k*h+3*h/4);} c=h/90*(7*((*f)(a)+(*f)(b))+14*c1+32*c2+12*c3+32*c4);return c;} float f(float x){ // return 1/sqrt(1+x*x*x); if(x==0)return 1; else return sin(x)/x;} void main(){ int i,n=4;float c;for(i=0;i<=4;i++){ // c=Cotes(f,0,1,n); c=Cotes(f,0,5,n); printf(“C(%d)=%fn”,n,c); n*=2;} } (2)实验结果及分析 四、总结 学习了复化辛卜生公式,自适应梯形公式,龙贝格算法,运用求解定积分并控制精度的方法。 习题七: 常微分方程数值解法 一、实验目的 (1)熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉公式,四阶龙格-库塔法和阿当姆斯方法; (2)编制上述方法计算机程序,包括求解微分方程组的计算程序;(3)针对实习题编制程序,并上机计算其所需要的结果; (4)体会各种解法的功能,优缺点及适用场合,会选取适当的求解方法。 二、实验内容 1、分别用改进欧拉法与四阶龙格-库塔公式(取h0.1)求解下列微分方程初值问题 2、用四阶龙格-库塔公式(取h0.1)解下列微分方程组初值问题 三、实验步骤、程序设计、实验结果及分析 1、分别用改进欧拉法与四阶龙格-库塔公式(取h0.1)求解下列微分方程初值问题 a.改进欧拉法(1)程序设计 #include yp=y+h*(*f)(x,y); x=x0+i*h; yc=y+h*(*f)(x,yp); y=(yp+yc)/2; printf(“x[%d]=%fty[%d]=%fn”,i,x,i,y);} } float f(float x,float y){ //return x*x+y*y; //题(1) //return 1/(1+y*y); //题(2) return y-2*x/y; //题(3)} void main(){ float xn=1.0,x0=0,y0=1; ModEuler(f,x0,y0,xn,10);} (2)实验结果及分析(1) (2) (3) b.四阶龙格-库塔公式(1)程序设计 #include K1=(*f)(x,y); K2=(*f)(x+h/2,y+h*K1/2); K3=(*f)(x+h/2,y+h*K2/2); K4=(*f)(x+h,y+h*K3); y=y+h*(K1+2*K2+2*K3+K4)/6; x=a+i*h; printf(“x[%d]=%fty[%d]=%fn”,i,x,i,y);} } float f(float x,float y){ //return x*x+y*y; //题(1) //return 1/(1+y*y); //题(2) return y-2*x/y; //题(3)} void main(){ float a=0,b=1.0,y0=1;Runge_Kutta(f,a,b,y0,10);}(2)实验结果(1) (2) (3) 2、四阶龙格-库塔公式解微分方程组初值问题(1)程序设计 #include K1=(*f)(x,y,z);l1=(*g)(x,y,z); K2=(*f)(x+h/2,y+h*K1/2,z+h*l1/2);l2=(*g)(x+h/2,y+h*K1/2,z+h*l1/2); K3=(*f)(x+h/2,y+h*K2/2,z+h*l2/2);l3=(*g)(x+h/2,y+h*K2/2,z+h*l2/2); K4=(*f)(x+h,y+h*K3,z+h*l3);l4=(*g)(x+h,y+h*K3,z+h*l3); y=y+h*(K1+2*K2+2*K3+K4)/6; z=z+h*(l1+2*l2+2*l3+l4)/6; x=a+i*h; printf(“x[%d]=%fty[%d]=%ftz[%d]=%fn”,i,x,i,y,i,z);} } float f(float x,float y,float z){ return 120-2*y+2*z; } float g(float x,float y,float z){ return 2*y-5*z; } void main(){ float a=0,b=1.0,y0=0,g0=0;Runge_Kutta(f,g,a,b,y0,g0,10);} (2)实验结果 四、总结 通过这次学习,我掌握了根据不同场合选择不同方法计算求解问题的方法,主要学习了改进欧拉法和四阶龙格-库塔法求解微分方程的求解问题方法。 计算方法上机汇总: 通过对这门课的学习,我们学习了很多计算方程、曲线拟合、求解微分方程的方法。而实习 课让我们将所学的原理应用到实践中去,上机编写程序的过程中我们不断的运用已学知识,掌握了求解各种实际问题的方法,并且体会了不同的方法的不同结果,从而在不同的场合,要用合适的计算方法来求解问题。我们求解的问题包括误差分析,线性方程组的求解,微分方程的求解等问题。在选择合适的计算方法的时候要考虑方法的收敛性,稳定性,以及哪种方法计算速度快,最终结果误差小。这门课与计算机密切结合并且实用性极强,能够将所学的知识在实践中得到应用,加强了我对专业学习的信心。 参考文献: 【1】孙志忠.计算方法典型例题分析.第二版.北京:科学出版社,2005 【2】孙志忠,袁慰平,计算方法与实习.第二版.南京:东南大学出版社,2011 【3】谭浩强.C程序设计.第四版.北京:清华大学出版社,2010 ◆ 《数值计算方法》 合肥工业大学数学与信息科学系 编 合肥工业大学出版社 ◆ 《计算方法》 邓建中等编,西安交大出版社,1985。 ◆ 《数值计算和C程序集》蒋长锦编著,中国科学技术大学出版社,1998。◆ 《计算方法引论》徐萃薇编,高等教育出版社,1999。 ◆ 黄友谦,程诗杰,陈浙鹏,《数值试验》,北京:高等教育出版社,1989 ◆ 蔡大用,《数值分析与实验学习指导》,北京:清华大学出版社与施普林格出版社,2001 ◆ 肖筱南,《值计算方法与上机实习指导》,北京:北京大学出版社,2004 ◆ A.Quarteroni, R.Sacco, F.Saleri,《Numerical Mathematics》, New York:Springer-Verlag, 2000 上机实验要求 一、实验前的准备工作 在上机实验前应事先做好准备工作,以提高上机实验的效率: 1.了解所用的计算机系统(包括C编译系统)的性能和使用方法。 2.复习和掌握与本实验有关的教学内容。 3.准备好上机所需程序。要仔细弄清题意,选择和设计合适的算法。在选择算法时,应当是在理解现有算法的基础上,自己动手画出流程图再设计源程序。手编写程序应当书写整齐,并经人工检查无误后才能上机,以提高上机效率。切忌不编写程序或抄袭他人程序,注意培养严谨踏实的学习作风。 4.对运行中可能出现的问题应率先作出估计;对程序中自己有疑问的地方,应作上记号,以便在上机时给予重视。 5.准备好调试和运行时所需的数据。 二、上机实验基本步骤 上机实验时应该独立上机。上机过程中出现的问题,除了系统问题外,一般应自己独立处理,不要轻易举手问教师。尤其对“出错信息”,应善于自己分析判断。这是学习调试程序的良好机会,碰到困难时切忌轻易放弃。 上机实验一般应包括以下步骤: 1.调出C编译系统,进入C工作环境,如Turbo C2.0集成环境。 2.输入自己编好的程序,注意正确的键盘输入指法。 3.检查一遍已经输入的程序是否有错(包括输入错误和编程中的错误)。 4.进行编译。如果编译和连接过程中发现错误,屏幕上会出现“出错信息”,则根据提示找到出错位置和原因,加以改正,再进行编译„„如此反复,直到顺利通过编译和连接为止。 5.运行程序,并分析运行结果是否正确、合理。组织多组实验数据,分别从不同情况下检查程序的正确性。 6.输出程序清单和运行结果。特别要进行上机调试记录(尤其是出错情况和排错记录),调试数据和运行结果记录、心得体会等。 三、撰写实验报告 做完实验后要写实验报告,对整个实验进行总结和提高,这是整个实验过程的一个重要环节,不要把它看成是一种不必要的负担,更不能敷衍了事。针对本课程的实验特点,建议在书写实验报告时应包括如下内容。 1.实验目的实验作为教学的一个重要环节,其目的在于更深入地理解和掌握课程教学中的有关基本概念和基本技术,从而进一步提高分析问题和解决问题的能力。因此,当着手做一个实验的时候,必须明确实验目的,以保证达到课程所指定的基本要求。在写实验报告时,要进一步确认是否达到了预期的目的。 2.实验内容 实验的目的是要通过解决一些具体问题来达到的。根据教学安排、进度、实验条件、可提供的上机时数、学生的基础等因素,逐步完成。在实验报告中,实验内容是指本次实验中实际完成的内容,在每一个实验题目中,一般都提出了一些具体要求,其中有些具体要求是为了达到实验目的而提出的。因此,在实验内容中,不仅要写清楚具体的实验题目,还应包括具体要求。 3.算法和流程图 算法设计是程序设计过程中一个重要步骤。本章的某些实验题目给出了方法说明,有的还提供了流程图,但有的没有给出流程图。如果在做实验的过程中,使用的算法或流程图和本书中给出的不一样,或者书中没有给出算法和流程图,则在实验报告中应给出较详细的算法说明与流程图,并对其中的主要符号与变量作相应的说明。 4.程序清单 程序设计的产品就是程序,它应与算法或流程图相一致。程序要具有易读性,符合模块化和结构化原则。 5.运行结果 程序运行结果一般是输出语句所输出的结果,对于不同的输入,其输出结果是不同的。因此,在输出结果之前一般还应注明输入的数据,以便对输出结果进行分析和比较。 6.调试分析和体会 这是实验报告中最重要的一项,也是最容易忽视的一项。实验过程中大量的工作是程序测试,在调试过程中会遇到各种各样的问题,每解决一个问题就能积累一点经验,提高编程的能力。因此,对实验的总结,最主要的是程序调试经验的总结。调试分析也包括对结果的分析。体会主要是指通过本次实验是否达到了实验目的,有哪些基本概念得到了深入理解等。 实验四 串的基本操作实现-堆存储结构的实现 一、实验目的1、熟悉visual C++上机环境,进一步掌握C语言的结构特点。 2、掌握串的基本操作:初始化串、判串为空、求串长等运算及C语言实现。 二、实验内容(参照课本上的第72-75页) 编写一个程序,实现求串长length_str、串连接、串比较、求子串、串插入、串删除操作。 三、实验报告要求(参照《数据结构题集》第83页实验报告模板) 实验报告必须有以下内容:实验目的、实验内容、实验要求、源程序、测试结果(打印界面的形式表示)。 实验八 折半查找 一、实验目的1、熟悉visual C++上机环境,进一步掌握C语言的结构特点。 2、进一步掌握图的基本概念及其含义。 3、掌握查找的结构特征,以及各种存储结构的特点及使用范围。 4、掌握查找的基本运算及其实现。 二、实验内容(参照课本上的第220页) 设计一个算法,实现折半查找算法。 三、实验要求 参照课本220页算法9.2 四、实验报告要求(参照《数据结构题集》第83页实验报告模板) 实验报告必须有以下内容:实验目的、实验内容、实验要求、源程序、测试结果(打印界面的形式表示)。第二篇:计算方法与实习上机报告
第三篇:上机实验要求
第四篇:上机实验四
第五篇:上机实验八