第一篇:計算方法與實習上機報告
計算方法與實習
——上機報告
學院:電子工程學院
2015.1.4
學號:***
姓名: 劉
波
習題一: 舍入誤差及穩(wěn)定性
一、實驗目的
(1)通過上機編程,復習鞏固以前所學程序設(shè)計語言及上機操作指令;(2)通過上機計算,了解舍入誤差所引起的數(shù)值不穩(wěn)定性
二、實驗內(nèi)容
?
21、用兩種不同的順序計算?n,分析其誤差的變化
n?1100002、已知連分數(shù)f?b0?a1,利用下面的算法計算f:
b1?a2/?b2?a3/(...?an/bn)?ai?
1(i?n?1,n?2,..., 0f?d0 di?1寫一程序,讀入n,b0,b1,...,bn,a1,...,an,計算并打印f dn?bn,di?bi?
3、給出一個有效的算法和一個無效的算法計算積分
xnyn??dx
(n?0,1,..., 104x?1N11?311?
4、設(shè)SN??2,已知其精確值為????
2?2NN?1?j?2j?1(1)編制按從大到小的順序計算SN的程序 1(2)編制按從小到大的順序計算SN的程序
(3)按兩種順序分別計算S1000,S10000,S30000,并指出有效位數(shù)
三、實驗步驟、程序設(shè)計、實驗結(jié)果及分析
?
21、用兩種不同的順序計算?n,分析其誤差的變化
n?110000(1)實驗步驟:
分別從1~10000和從10000~1兩種順序進行計算,應包含的頭文件有stdio.h和math.h(2)程序設(shè)計: 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)實驗結(jié)果及分析: 程序運行結(jié)果: a.順序計算
b.逆序計算
結(jié)果分析:兩種不同順序計算結(jié)果是一樣的,順序計算誤差從一開始就很小,而逆序計算誤差最開始十分大,后來結(jié)果正確。
2、已知連分數(shù)f?b0?(1)實驗步驟: 利用 dn?bn,di?bi?a1,計算f:
b1?a2/?b2?a3/(...?an/bn)?ai?1,0
(i?n?1,n?2,...,f?d0,計算f
di?1(2)程序設(shè)計 #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)實驗結(jié)果 程序運行結(jié)果: 3、給出一個有效的算法和一個無效的算法計算積分 xnyn??dx (n?0,1,..., 104x?11(1)實驗步驟 利用C語言編寫程序,分別使用數(shù)值穩(wěn)定的和數(shù)值不穩(wěn)定的計算公式所建立的遞推公式進行計算。 (2)程序設(shè)計 #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無效算法的輸出結(jié)果: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)實驗結(jié)果及分析 程序運行結(jié)果: 結(jié)果分析:無效算法數(shù)值不穩(wěn)定,誤差造成的影響特別大 4、設(shè)SN? ?j?2N11?311?,已知其精確值為???? 2?2NN?1?j2?1(1)實驗步驟 先編程按從大到小的順序計算SN的程序,再編程按從小到大的順序計算SN的程序,然后按兩種順序分別計算S1000,S10000,S30000。(2)程序設(shè)計 #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)實驗結(jié)果及分析 程序運行結(jié)果: : : 結(jié)果分析:不同順序計算所得結(jié)果是一樣的。 四、總結(jié) 通過這次上機,學習了解了舍入誤差在不同算法時對結(jié)果的影響不同,穩(wěn)定的算法才能獲得正確的結(jié)果。 習題二: 一、實驗目的 (1)通過對二分法與牛頓迭代法做編程練習和上機運算,進一步體會二分法和牛頓法的不同。 (2)編寫割線迭代法的程序,求非線性方程的解,并與牛頓迭代法作比較。 二、實驗內(nèi)容 1、用牛頓法求下列方程的根(1)x?e?0 (2)xe?1?0(3)lgx?x?2?0 2、編寫割線法程序求解第一問的方程 三、實驗步驟、程序設(shè)計、實驗結(jié)果及分析 1、牛頓法(1)實驗步驟 通過定義牛頓法求方程的子函數(shù),用main函數(shù)調(diào)用子函數(shù)求根(2)程序設(shè)計 #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(“l(fā)g(x)+x-2,n”);answer(ff3);return 0;}(3)實驗結(jié)果及分析 2、割線法(1)程序設(shè)計 #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)實驗結(jié)果及分析 四、總結(jié) 了解和學習了二分法和牛頓迭代法的思想以及程序設(shè)計的方法,比較了迭代法和牛頓法的特點:牛頓法收斂速度較快,但對初值選取要求較高;割線法計算量少。 習題三: 線性方程組數(shù)值解法 一、實驗目的 (1)熟悉求解線性方程組的有關(guān)理論和方法; (2)會編制列主元消去法,LU分解法,雅可比及高斯-賽德爾迭代法的程序;(3)通過實際計算,進一步了解各種方法的優(yōu)缺點,選擇合適的數(shù)值方法。 二、實驗內(nèi)容 1、用列主元消去法解方程組 2、用LU分解法解方程組 三、實驗步驟、程序設(shè)計、實驗結(jié)果及分析 1、用列主元消去法解方程組(1)程序設(shè)計 #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)實驗結(jié)果及分析 (1)題 (2)題 2、用LU分解法解方程組(1)程序設(shè)計 #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));} } 四、總結(jié) 掌握了用列主元消去法和LU分解法求解方程組程序編寫的技巧。 習題四: 插值法 一、實驗目的 (1)熟悉拉格朗日插值法多項式和牛頓插值多項式,注意其不同點;(2)掌握三次樣條插值解決一些實際問題。 二、實驗內(nèi)容 1、按所給數(shù)據(jù)做二次插值,并求給定點的函數(shù)值 2、按所給數(shù)據(jù)做五次插值,并求給定點的函數(shù)值 3、牛頓前插公式計算函數(shù)值 三、實驗步驟、程序設(shè)計、實驗結(jié)果及分析 1、二次插值(1)程序設(shè)計 #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)實驗結(jié)果 2、五次插值(1)程序設(shè)計 #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)實驗結(jié)果 3、牛頓前插公式計算函數(shù)值(1)程序設(shè)計 #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)實驗結(jié)果 四、總結(jié) 學習了插值法,學會了利用插值法編程求多項式的解,可以求解很多問題,讓求解多項式解變得非常簡單。 習題五: 曲線擬合 一、實驗目的 (1)了解最小二乘法的基本原理,通過計算機解決實際問題;(2)了解超定方程組的最小二乘解法。 二、實驗內(nèi)容 1、分別用拋物線y?a?bx?cx2和指數(shù)曲線y?aebx擬合所給數(shù)據(jù),并比較這兩個擬合函數(shù)的優(yōu)劣。 2、按所給實驗數(shù)據(jù),用形如y?a?bx的拋物線進行最小二乘擬合。 三、程序設(shè)計、結(jié)果分析 1、分別用拋物線y?a?bx?cx和指數(shù)曲線y?ae擬合所給數(shù)據(jù) a.拋物線 (1)程序設(shè)計: #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)實驗結(jié)果 2、最小二乘擬合(1)程序設(shè)計 #include //增加了數(shù)組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)實驗結(jié)果 四、總結(jié) 通過曲線擬合,最小二乘法的基本原理的學習,我學會了利用計算機解決現(xiàn)實實際問題中的曲線擬合。 習題六: 數(shù)值積分 一、實驗目的 (1)通過實際計算體會各種方法的精確度;(2)會編寫用龍貝格算法求定積分的程序。 二、實驗內(nèi)容 編寫復化柯特斯求積分公式,并計算例題1例題2,觀察n為多少時有6位有效數(shù)字。 三、程序設(shè)計、實驗結(jié)果及分析(1)程序設(shè)計 #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)實驗結(jié)果及分析 四、總結(jié) 學習了復化辛卜生公式,自適應梯形公式,龍貝格算法,運用求解定積分并控制精度的方法。 習題七: 常微分方程數(shù)值解法 一、實驗目的 (1)熟悉求解常微分方程初值問題的有關(guān)方法和理論,主要是改進歐拉公式,四階龍格-庫塔法和阿當姆斯方法; (2)編制上述方法計算機程序,包括求解微分方程組的計算程序;(3)針對實習題編制程序,并上機計算其所需要的結(jié)果; (4)體會各種解法的功能,優(yōu)缺點及適用場合,會選取適當?shù)那蠼夥椒ā?/p> 二、實驗內(nèi)容 1、分別用改進歐拉法與四階龍格-庫塔公式(取h?0.1)求解下列微分方程初值問題 2、用四階龍格-庫塔公式(取h?0.1)解下列微分方程組初值問題 三、實驗步驟、程序設(shè)計、實驗結(jié)果及分析 1、分別用改進歐拉法與四階龍格-庫塔公式(取h?0.1)求解下列微分方程初值問題 a.改進歐拉法(1)程序設(shè)計 #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)實驗結(jié)果及分析(1) (2) (3) b.四階龍格-庫塔公式(1)程序設(shè)計 #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)實驗結(jié)果(1) (2) (3) 2、四階龍格-庫塔公式解微分方程組初值問題(1)程序設(shè)計 #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)實驗結(jié)果 四、總結(jié) 通過這次學習,我掌握了根據(jù)不同場合選擇不同方法計算求解問題的方法,主要學習了改進歐拉法和四階龍格-庫塔法求解微分方程的求解問題方法。 計算方法上機匯總: 通過對這門課的學習,我們學習了很多計算方程、曲線擬合、求解微分方程的方法。而實習 課讓我們將所學的原理應用到實踐中去,上機編寫程序的過程中我們不斷的運用已學知識,掌握了求解各種實際問題的方法,并且體會了不同的方法的不同結(jié)果,從而在不同的場合,要用合適的計算方法來求解問題。我們求解的問題包括誤差分析,線性方程組的求解,微分方程的求解等問題。在選擇合適的計算方法的時候要考慮方法的收斂性,穩(wěn)定性,以及哪種方法計算速度快,最終結(jié)果誤差小。這門課與計算機密切結(jié)合并且實用性極強,能夠?qū)⑺鶎W的知識在實踐中得到應用,加強了我對專業(yè)學習的信心。 參考文獻: 【1】孫志忠.計算方法典型例題分析.第二版.北京:科學出版社,2005 【2】孫志忠,袁慰平,計算方法與實習.第二版.南京:東南大學出版社,2011 【3】譚浩強.C程序設(shè)計.第四版.北京:清華大學出版社,2010 ◆ 《數(shù)值計算方法》 合肥工業(yè)大學數(shù)學與信息科學系 編 合肥工業(yè)大學出版社 ◆ 《計算方法》 鄧建中等編,西安交大出版社,1985。 ◆ 《數(shù)值計算和C程序集》蔣長錦編著,中國科學技術(shù)大學出版社,1998。◆ 《計算方法引論》徐萃薇編,高等教育出版社,1999。 ◆ 黃友謙,程詩杰,陳浙鵬,《數(shù)值試驗》,北京:高等教育出版社,1989 ◆ 蔡大用,《數(shù)值分析與實驗學習指導》,北京:清華大學出版社與施普林格出版社,2001 ◆ 肖筱南,《值計算方法與上機實習指導》,北京:北京大學出版社,2004 ◆ A.Quarteroni, R.Sacco, F.Saleri,《Numerical Mathematics》, New York:Springer-Verlag, 2000 龍格-庫塔 #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; } 《計算方法》 上機 實驗報告 班 級:XXXXXX 小組成員: :XXXXXXX XXXXXXX XXXXXXX XXXXXXX 任課教 師:XXX 二〇一八年五月二十五日 前言 通過進行多次得上機實驗,我們結(jié)合課本上得內(nèi)容以及老師對我們得指導,能夠較為熟練地掌握Newton 迭代法、Jacobi 迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法與Gauss 求積公式等六種算法得原理與使用方法,并參考課本例題進行了 MATLAB 程序得編寫。 以下為本次上機實驗報告,按照實驗內(nèi)容共分為六部分.實驗 一: 一、實驗 名稱 及題目: : New tn on 迭代法 例 2、7(P38):應用 Newton 迭代法求 在 附近得數(shù)值解,并使其滿足、二、解題 思路: 設(shè)就是得根,選取作為初始近似值,過點做曲線得切線,得方程為,求出與軸交點得橫坐標,稱為得一次近似值,過點做曲線得切線,求該切線與軸得橫坐標稱為得二次近似值,重復以上過程,得得近似值序列,把稱為得次近似值,這種求解方法就就是牛頓迭代法。 三、b Matlab 程序 代碼: f f u nc t ion newt o n_it er r at io n(x 0 ,tol) syms z % % 定義自變量 f f o rma t l l on n g %定義精度 f= = z *z *z z--z z - 1; f1=diff(f); %求導 y=su b s(f,z ,x0); y1=s u bs(f 1, , z,x0);% % 向函數(shù)中代值 x1=x0 - y/y1;k=1 ; w w h il e abs((x1 1 — x0)〉= = t ol x x 0 =x1; y=sub s(f,z, x 0); y1=sub s((f 1, z, , x 0); x1 = x0--y /y1 ; k=k+1; e nd x =dou b le(x x 1)) K 四、運行 結(jié)果: 實驗二: : 一、實驗名稱 及題目: Jac ob b i迭代法 例3、7(P74):試利用 Jacobi 迭代公式求解方程組 要求數(shù)值解 為方程組得精確解、二、解題思路 : 首先將方程組中得系數(shù)矩陣分解成三部分,即:,為對角陣,為下三角矩陣,為上三角矩陣。之后確定迭代格式,(, 即迭代次數(shù)),稱為迭代矩陣。最后選取初始迭代向量,開始逐次迭代。最后驗證精度。(迭代陣:。)雅克比迭代法得優(yōu)點明顯,計算公式簡單,每迭代一次只需計算一次矩陣與向量得乘法,且計算過程中原始矩陣 A 始終不變,比較容易并行計算.然而這種迭代方式收斂速度較慢,而且占據(jù)得存儲空間較大。 三、Mb atlab 程序代碼: : functio n jacob i(A A,b,x0,ep s,x1)) D = = diag(diag(A));% % 求A得對角矩陣 L = —t t ril l(A,--1);% %求 求 A A 得下三角矩陣 U U =--tr r iu((A, , 1);%求 A A 得上三角矩陣 B = D(L+ U)); f = D\b; x = B*x x 0 +f ; n = 1;% % 迭代次數(shù) wh ile no o rm((x — x1)> =eps s x = B * x+f ; n = n+1; end format lo ng g n n x jingdu= n orm(x — x 1) 四、運行 結(jié)果: 實驗三: : 一、實驗 名稱及題目: : Gauss — Seide l 迭代法 例3、8(P75):試利用 Gauss-Seidel 迭代公式求解方程 組,并 使 其 數(shù) 值 解為方程組得精確解、二、解題思路: : Gauss-Seidel迭代法與 Jacobi 迭代法思路相近,首先將方程組中得系數(shù)矩陣分解成三部分,即:,為對角陣,為下三角矩陣,為上三角矩陣.之后確定迭代格式,,(, 即迭代次數(shù)),稱為迭代矩陣。最后選取初始迭代向量,開始逐次迭代。最后驗證精度。(迭代陣:.)Gauss—Seidel迭代法與 Jacobi 迭代法相比速度更快,但不全如此。有例子表明:Gauss-Seidel 迭代法收斂時,Jacobi迭代法可能不收斂;而Jacobi迭代法收斂時,Gauss—Seidel 迭代法也可能不收斂。 三、Ma a tl l ab程序代碼: fu n ctio n g g a uss_ se e i del(A,b, x0 0,eps,x1) D = di ag(d iag((A)));% %求 求 A A 得對角矩陣 L L = = -t ri l((A,— 1);;%求 A A 得下三角矩陣 U U = — triu(A,1);%求 A A 得上三角矩陣 B =(D -L))U; f f =(D D — L))b; x = = B B * x0+ f;; n = 1;% % 迭代次數(shù) w hil e norm(x1--x)>=eps x = B*x+f; n = n+1; e nd format lon g n n x x j j i ngdu=norm(x1 — x) 四、運行 結(jié)果: : 實驗 四: : 一、實驗 名稱及題目: : Lagra n ge 插值法 例 4、1(P88): 給 定 函 數(shù) 及 插 值 節(jié) 點、試構(gòu)造 Lagrange 插值多項式,給出其誤差估計,并由此計算 及其誤差、二、解題思路: : 一般來說,如果我們有個點,各互不相同。那么應用拉格朗日插值公式所得到得拉格朗日插值多項式為:,其中每個為拉格朗日基本多項式(或稱插值基函數(shù)),其表達式為:。 三、Matl ab b 程序代碼: : f f u nctio n y y = lagrange(x 0,x) n=lengt h(x0);% % 向量長度 s= 0; f or k=1:nk %k 從 從 1 1 到 到 n n 得循環(huán) p=1 1、0; for j= 1 :n if j j ~ =k %“ ~= ”不等于得意思 p =p*(x x — x 0(j))/(x0(k)--x0(j)); e nd en d y 0= x0((k)*(1+cos(x x 0(k)));; s= p*y 0+ s;; end format lon g s wu ch a =a b s(x*((1 +c o s(x)))--s) 四、運行結(jié)果 :、五、Lagran ge e插值圖像繪制 %Lagrange插值圖像算法 x=linspace(0,1002,200); s=linspace(0,1000,200); x0=[0;pi/8;pi/4;3*pi/8;pi/2]; n=length(x0); s=0; for k=1:n p=1、0; for j=1:n if j~=k p=p、*(x-x0(j))/(x0(k)—x0(j)); end end y0=x0(k)*(1+cos(x0(k))); s=p*y0+s; end plot(x,s,’r“); grid on; title(”Lagrange2??μí???’) xlabel(’X’),ylabel(“Y”); axis normal; 實驗 五: : 一、實驗 名稱及題目: : Ne wt on 插值法 例 4、3(P 96): 已 知 , 試 取 插 值 節(jié) 點,構(gòu)造 4 次 Newton 插值多項式,由此計算 得逼近值,并指出其絕對誤差、二、解題思路: : 將 拉 格 朗 日 插 值 公 式 中 得 改 寫成:))...((...))(()()(1 0 1 0 2 0 1 0 ?? ? ? ? ? ? ? ? ? ?n n nx x x x a x x x x a x x a a x N ,其中,為待 定 定 系 數(shù).又 。 將 帶 入 可得:))...()(](,..., , [...)](, [)()(1 1 0 1 0 0 1 0 0 ?? ? ? ? ? ? ? ?n nx x x x x x x x x f x x x x f x f x f.三、Matl ab b 程序代碼: : function newt on _interpol a tion(x 0,x)) f f orm m at(yī) t lo ng g n n =l l en gt h((x 0); syms z f =sq rt t(1+c os h(z)^ 2); a(1)= sub s(f,z,x 0(1));; f or k=1 :n — 1 y0=subs(f,z z,x x 0(k))); y 1=subs(f, z,x0(k+ 1)));; d(k,1) =(y1--y y 0)/(x 0(k +1 1)-x x 0(k k));;%一階差商 e nd f f or r j=2: n--1 1 fo r k k =1 1 :n n —j j d(k, j) =(d(k+1,j j — 1))— d(k, j- 1))/(x0((k +j)-x x 0((k));% % 二階差商及以上 en d end d d d o uble(d)) for j =2: n a(j)=d(1,j — 1); end b b(1 1) =1 ;c c(1)= a(1); f f or r j=2 :n n b b(j) =(x--x0(j j--1))、*b(j j — 1);; c(j)=a(j)、*b(j); e e nd d n n p =dou b le(su m(c c)) w w u cha=d ou bl e(abs(np--su bs(f ,z,x))))) 四、運行結(jié)果: 五、Newton插值 圖 像繪制 實驗 六: : 一、實驗 名稱及題目: Gauss 求積公式 例 5、7(P140):試構(gòu)造 Gauss 型求積公式,并由此計算積分、二、解題思路: : 設(shè)高斯-勒讓德求積公式就是:,依次代入,解得.利用換元公式變換原式得積分上下限,在套用高斯—勒讓德求積公式求得積分.三、b Matlab 程序代碼: : fu u n ct io o n g aus s(a,b) sy m s t t f=sqrt(t t)/(1 + t)^2; P P =[--s s q rt(3/5)0 sqrt(3 /5)]; A=[ 5/ 9 8/9 5 /9 9 ]; s= 0; f or i i = 1:3; x=P(i); y=s u bs(f,t,(b--a)* x /2+(a+b b) /2);; s=s + A(i)*y; end form a t l ong S= d oub l e((a a — b)/2* s) 四、運行結(jié)果: : 結(jié)束語 在本學期得《計算方法》課程學習中,我們感受到了巧妙得數(shù)學計算方法在解決實際問題中帶來得便利與高效,借助計算機解決科學計算問題也就是我們當代大學生應當掌握得必要技能。 在本課程得上機實驗過程中,我們親自體驗了課本中所學到得算法在計算機上得使用,使用計算機語言,如MATLAB 與 C 語言等進行編程,加深了我們對各類算法及其理論得理解,并進一步激發(fā)了我們對《計算方法》這門課程進行持續(xù)學習得學習興趣。 文獻檢索實習報告(參考格式) 課程名稱:文獻檢索日期: 學院:班號:姓名:學號: 實驗名稱:電子圖書等資源檢索。 實驗目的:掌握圖書資源如何檢索和利用,熟悉人名錄或機構(gòu)名錄的檢索。實驗內(nèi)容: 1、用CALIS檢索你們自己任課教師的編著發(fā)表情況。 2、用超星檢索自己所在專業(yè)的某一方面的圖書出版情況,并采集某一本書的一段文字,一個圖。(以超星為例) (1).登陸四川理工學院圖書館主頁。 (2).找到電子資源,點擊進入圖書館電子資源界面。 (3).找到熱門資源中的“超星數(shù)字圖書館”,并點擊“本地”,進 入超星數(shù)字圖書館。 (4).找到“瀏覽器”,點擊并下載超星星瀏覽器。 (5).下載好“超星星瀏覽器”后就可以瀏覽圖書了。 (6).例如查 3、利用物競化學品數(shù)據(jù)庫檢索某一具體化學物質(zhì)的相關(guān)數(shù)據(jù)。 4、用萬方數(shù)據(jù)庫檢索我國某一位院士/科學家/某學科領(lǐng)域著名學者的名錄。 實習報告要求:用自己姓名作為文件名稱,將作業(yè)發(fā)送給各班指定的同學。 計算機上機實習報告 姓名:張陸浩 班級:高材11001 學號:201001978 老師:張老師 熊老師 時間:2011年12月24日 一.實驗目的: 1.熟悉VB 6.0的開發(fā)環(huán)境,掌握基本的編程方法,熟悉用VB語言完成一個應用程序的設(shè)計過程,掌握有關(guān)編輯和調(diào)試程序的方法和技巧;2.主要掌握VB語言中的標準模塊的建立﹑數(shù)據(jù)文件的讀出與寫入、數(shù)組與選擇結(jié)構(gòu)的運用,圖形操作等內(nèi)容 3.了解開發(fā)簡單應用程序的全過程,包括:分析﹑設(shè)計﹑編程﹑調(diào)試和編寫報告.二.實習要求: (一)。用記事本新建一個文本文件,將本班M名學生N門考試課的成績輸入到這個文件中,建議按如下形式存放(注:20=M<=50,5<=N<=8,下文以M=4,N=3為例): 學號 姓名 英語 數(shù)學 物理 化學 VB 1 張陸浩 2 林丹 3 李宗偉 4 李永波 (二)。將N門考試課以及其分數(shù)輸入到另一個數(shù)據(jù)文件(文件類型同上題)中,建議以下列形式存放: 編號 課程名稱 課程學分 1 英語 5.0 2 數(shù)學 4.5 3 物理 5.0 4 化學 4.5 5 VB 4.5 (三)。請編寫一個簡單的學生成績管理程序,以完成以下功能: 1.根據(jù)以上兩文件內(nèi)容分別計算每個學生N門課程的加權(quán)平均分(保留兩位小數(shù),四舍五入),按平均分排列名次,平均分相同則名 次并列。用VB創(chuàng)建一個數(shù)據(jù)文件,存放班級的成績表。 2.分別統(tǒng)計全班每門課的平均分,并計算各分數(shù)段(90分以上;80~89;70~79;60~69;60分以下)的學生數(shù)。.3.打印每名學生成績條(并將結(jié)果存放到用VB創(chuàng)建的一個新的數(shù)據(jù)文件中)。 4.顯示所有存在不及格課程的學生的名單(含學號,不及格課程名稱,課程的學分及成績)。 5.屏幕顯示優(yōu)等生名單及打印每門課程成績分布圖。優(yōu)等生條件(只要滿足三個中任一個就可以): a)平均分>=90分 b)名次在本班位于前四名 c)平均分>=85分,并且至少有一門課的成績>=95分 三、實習步驟 1、用記事本新建一個學生成績文本文件(其中包括學生學號,成績,姓名,課程及成績)。 2、用記事本新建一個課程學分文本文件。 3、編輯菜單編輯器:編輯四個可拉式菜單,包括學生成績、成績處理、成績編輯、畫圖。 4、編輯代碼:分別編輯打印學生成績和學分代碼,編輯加權(quán)平均分、各科平均分、分數(shù)段、成績條、排名、優(yōu)等生、差等生的代碼,還有畫各科目成績?nèi)藬?shù)圖的代碼。 5、調(diào)試程序代碼并保存。 6、打印代碼。 三.相關(guān)數(shù)據(jù)列表: (一)。源文件 (1)成績 學號 姓名 英語 數(shù)學 物理 化學 VB 1 張陸浩 97 98 97 97 98 2 林丹 92 87 79 91 84 3 李宗偉 75 96 83 75 73 4 李永波 89 93 83 86 82 5 王儀涵 92 79 89 86 80 6 汪鑫 93 65 86 68 84 7 付海峰 94 91 89 92 80 8 湛龍 86 83 88 80 92 9 蓋德 68 79 54 72 71 10 陶菲克 69 76 59 81 75 11 佐佐木 85 83 68 57 71 12 李娜 94 63 62 65 53 13 陳金 86 79 89 94 83 14 蘭洋 91 93 92 89 75 15 小志 95 89 93 86 87 16 棃一名 92 86 83 67 59 17 吳凱飛 67 75 57 82 62 18 江方 93 80 73 76 84 19 胡艷 74 68 58 63 71 20 張繼原 68 95 68 84 93(2).學分 編號 課程名稱 課程學分 1 英語 5.0 2 數(shù)學 4.5 3 物理 5.0 4 化學 4.5 5 VB 4.5 四.運行效果: (一).學生管理 (1)打開課程成績及學分 (2)打開計算的加權(quán)平均分﹑排名及各科平均分 (三).編輯 (1)打開計算的各科人數(shù)分布 (2)打開按學號查找每個學生的成績 a)輸入要查找學生的學號 b)得到該生的成績條 (3)打開查找到的優(yōu)等生信息 (4)打開不及格學生的分布 (四).成績分布圖 五.實習小結(jié) 通過兩個星期的上機實習,我體會頗深,不僅表現(xiàn)在VB語言程序設(shè)計中,而且表現(xiàn)在與人交流和獨立自主完成任務(wù)的決心中。 本次上機在VB程序設(shè)計中我學會了很多以前不會或根本一點都不懂的東西。比如,在程序設(shè)計過程中,剛開始我弄不清楚怎樣把編輯的文件讀到VB中,但是通過詢問老師和同學討論,終于弄清了思路,即先將文件打開,再將數(shù)據(jù)分別放入若干個數(shù)組中,最后再將它讀出來。除此之外,我還明白了變量的作用域?qū)幊痰闹匾院妥舆^程,函數(shù)過程數(shù)據(jù)處理的幫助。而對以前學的,像選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)等也進行了鞏固和運用。在數(shù)據(jù)處理和打印的時候進行了大量運用。為了使程序更人性化化,我還運用了msgbox,inputbox等方法,使我對所學的知識進行了綜合的運用。 我相信通過這次實習,我對VB和計算機語言都有了更深刻的認識。雖然在實習的過程中,我發(fā)現(xiàn)了自己在編寫程序中的不足,像思維不夠嚴密等,但我相信,只要認真、努力就一定會有收獲 六.程序代碼 (一).創(chuàng)建標準模塊 Type student “定義變量:student” number As String * 9 name As String * 3 score(1 To 5)As Single average As Single rank As Integer End Type Type class “定義變量:class” num As String * 9 nam As String * 3 scor As Single End Type Public stu()As student, cla()As class, sumscor As Integer, subj()As class Public q(5)As Integer, t(5)As Integer, x(5)As Integer, y(5)As Integer, h(5)As Integer “定義刪除空格函數(shù)” Public Function deletespace(str As String)As String Dim i% i = InStr(str, “ ”)Do While i <> o str = Replace(str, “ ”, “ ”)i = InStr(str, “ ”)Loop deletespace = str End Function Public Sub addave(stu()As student, cou()As course)“定義計算加 For i = 1 To UBound(stu)權(quán)平均分 Dim jqpj!, x!, y!的子過 程 x = 0 y = 0 For j = 1 To 5 x = x + cou(j).score y = y + stu(i).score(j)* cou(j).score Next j stu(i).jqpj = y / x Next i End Sub Public Sub mc(stu()As student)“定義計算排名的子過程” For i = 1 To UBound(stu)stu(i).rank = 0 For j = 1 To UBound(stu)If stu(i).jqpj <= stu(j).jqpj Then stu(i).rank = stu(i).rank + 1 End If Next j Next i End Sub(二).讀取考試成績和課程學分(1).打開文件 Private Sub studentscore_Click()CommonDialog1.Filter = “文本文件|*.txt” CommonDialog1.ShowOpen Open CommonDialog1.FileName For Input As #1 Line Input #1, str1 Print str1 Do While Not EOF(1)Line Input #1, str str = deletespace(Trim(str))a = Split(str, “ ”)n = n + 1 ReDim Preserve stu(n)stu(n).number = a(0)stu(n).name = a(1)For i = 1 To 5 stu(n).score(i)= a(i + 1)Next i Loop For i = 1 To n Print stu(i).number;Spc(1);stu(i).name;Spc(3);For j = 1 To 5 Print stu(i).score(j);Spc(3);Next j Print Next i Close #1 End Sub Private Sub classrank_Click()CommonDialog2.Filter = “文本文件|*.txt” CommonDialog2.ShowOpen Open CommonDialog2.FileName For Input As #2 Line Input #2, str2 Print str2 sumscor = 0 Do While Not EOF(2)Line Input #2, str3 str3 = deletespace(Trim(str3))b = Split(str3, “ ”)m = m + 1 ReDim Preserve cla(m)cla(m).num = b(0)cla(m).nam = b(1)cla(m).scor = b(2)sumscor = sumscor + Val(cla(m).scor)Loop For k = 1 To m Print cla(k).num;Spc(2);cla(k).nam;Spc(3);cla(k).scor;Spc(3)Next k End Sub(2).分數(shù)處理 Private Sub ran_Click()“加權(quán)平均分及名次” Form1.Cls For n = 1 To 20 sum = 0 For i = 1 To 5 sum = sum + stu(n).score(i)* cla(i).scor Next i stu(n).average = Format(sum / sumscor, “##.##”)Next n For n = 1 To 20 stu(n).rank = 1 For j = 1 To 20 If stu(n).average < stu(j).average Then stu(n).rank = stu(n).rank + 1 End If Next j Next n Print “學號”;Spc(6);“姓名”;Spc(4);“英 語”;Spc(2);“數(shù) 學”;Spc(2);“ 物 理”;Spc(3);“化 學”;Spc(2);“V B”;Spc(2);“加權(quán)平均分”;Spc(2);“名次” For n = 1 To 20 Print stu(n).number;Spc(1);stu(n).name;Spc(3);For i = 1 To 5 Print stu(n).score(i);Spc(3);Next i Print stu(n).average;Spc(3);stu(n).rank Next n End Sub Private Sub eaverage_Click()“ 課程平均分” Print Spc(7);“英 語”;Spc(1);“數(shù) 學”;Spc(1);“ 物 理”;Spc(1);“化 學”;Spc(1);“V B” Print “平均分”;For i = 1 To 5 sum = 0 For n = 1 To 20 sum = sum + stu(n).score(i)Next n j = Format(sum / 20, “00.00”)Print Spc(2);j;Next i End Sub(3).編輯 Private Sub scor_Click()“計算打印個分數(shù)段人數(shù)” Form1.Cls Print “范圍”;“英 語”;Spc(3);“數(shù) 學”;Spc(3);“ 物 理”;Spc(3);“化 學”;Spc(3);“V B” For i = 1 To 5 For n = 1 To 20 Select Case stu(n).score(i)Case 90 To 100 q(i)= q(i)+ 1 Case 80 To 89 x(i)= x(i)+ 1 Case 70 To 79 t(i)= t(i)+ 1 Case 60 To 69 h(i)= h(i)+ 1 Case Else y(i)= y(i)+ 1 End Select Next n Next i Print “>90”;For i = 1 To 5 Print Spc(4);q(i);Next i Print Print “80_89”;For i = 1 To 5 Print Spc(4);x(i);Next i Print Print “70_79”;For i = 1 To 5 Print Spc(4);t(i);Next i Print Print “60_69”;For i = 1 To 5 Print Spc(4);h(i);Next i Print Print “<60”;For i = 1 To 5 Print Spc(4);y(i);Next i End Sub Private Sub stuscolist_Click()“打印成績條” Form1.Cls n = InputBox(“請輸入學號”)Print “學號”;Spc(5);“姓名”;Spc(3);“英 語”;Spc(3);“數(shù) 學”;Spc(3);“ 物 理”;Spc(3);“化 學”;Spc(3);“V B” Print stu(n).number;Spc(1);stu(n).name;Spc(3);For i = 1 To 5 Print stu(n).score(i);Spc(3);Next i End Sub Private Sub excellent_Click()“打印優(yōu)等生” Form1.Cls Dim t As Integer Print “姓名”;Spc(4);“學號”;Spc(8);“英 語”;Spc(4);“數(shù) 學”;Spc(3);“ 物 理”;Spc(3);“化 學”;Spc(4);“V B”;Spc(6);“平均分”;Spc(4);“名次” For i = 1 To 20 t = 0 For j = 1 To 5 If stu(i).score(j)>= 95 Then t = t + 1 End If Next j If stu(i).average >= 85 And t >= 2 Or stu(i).average >= 90 Or stu(i).rank <= 3 Then Print stu(i).name;Spc(2);stu(i).number;Spc(3);For j = 1 To 5 Print stu(i).score(j);Spc(5);Next j Print stu(i).average;Spc(5);stu(i).rank End If Next i End Sub Private Sub ugstulist_Click()“打印不及格學生” Form1.Cls For n = 1 To 20 For i = 1 To 5 If stu(n).score(i)< 60 Then Print stu(n).number;stu(n).name;stu(n).score(i);cla(i).nam;cla(i).scor End If Next i Next n End Sub(5).成績分布圖 Private Sub Command1_Click()“新建窗體form2” For i = 0 To 4 Picture1(i).Scale(0, 14)-(100, 0)Picture1(i).Line(10, 2)-(92, 2), vbRed Picture1(i).Print “分數(shù)段” Picture1(i).Line(10, 2)-(10, 14), vbRed Picture1(i).Print “人數(shù)” For j = 2 To 10 Step 2 Picture1(i).CurrentY = j + 2 Picture1(i).CurrentX = 4 Picture1(i).Print j Next j Picture1(i).CurrentX = 10 Picture1(i).CurrentY = 2 Picture1(i).Line(10, 2)-(26, 2 + q(1 + i)), vbGreen, BF Picture1(i).CurrentX = 26 Picture1(i).CurrentY = 2 Picture1(i).Line(26, 2)-(42, 2 + x(i + 1)), vbRed, BF Picture1(i).CurrentX = 42 Picture1(i).CurrentY = 2 Picture1(i).Line(42, 2)-(58, 2 + t(i + 1)), vbGreen, BF Picture1(i).CurrentX = 58 Picture1(i).CurrentY = 2 Picture1(i).Line(58, 2)-(74, 2 + h(i + 1)), vbRed, BF Picture1(i).CurrentX = 74 Picture1(i).CurrentY = 2 Picture1(i).Line(74, 2)-(90, 2 + y(i + 1)), vbGreen, BF Picture1(i).Line(10, 2)-(26, 2), vbGreen Picture1(i).Line(26, 2)-(42, 2), vbRed Picture1(i).Line(42, 2)-(58, 2), vbGreen Picture1(i).Line(58, 2)-(74, 2), vbRed Picture1(i).Line(74, 2)-(90, 2), vbGreen Picture1(i).CurrentX = 10 Picture1(i).CurrentY = 2 Picture1(i).Print “ >=90 80-89 70-79 60-69 <=60” Next i End Sub第二篇:計算方法上機實驗
第三篇:計算方法上機實驗報告
第四篇:上機實習報告格式
第五篇:計算機上機實習報告