||
“虽有嘉肴,弗食不知其旨也;虽有至道,弗学不知其善也。是故学然后知不足,教然后知困。知不足,然后能自反也;知困,然后能自强也。故曰:教学相长也。”
这些天带学生上机做《数值分析》的题,辅导这些大三非计算机专业学生上机是很热闹的事,不少同学找不到错在哪里就喊老师帮忙看看,每组30几个同学写的C语言程序五花八门,对我也是个挑战,不但要找一些简单的符号错误,还得在他们不同的程序思路中来回切换。上午上完课,下午就犯困,真是“教然后知'困'”,不过通过为同学们查错,我也自强了点。
最不好看的程序是语法没错,结果不对,几个同学下课了还不想让老师走,只好答应他们考回来看看。这是一个同学的三次样条插值程序,好几处错误,调试完后又“知困”了,困惑于想把学生都教会真难办,还有一大半自己同学没调试好呢。
#include<stdio.h>
#define N 4
void zhuiganfa(double a[],double b[],double c[],double f[],double x[])
{double bt[N],y[N];
bt[0]=c[0]/b[0];
for(int i=1;i<N-1;i++)
bt[i]=c[i]/(b[i]-a[i]*bt[i-1]);
y[0]=f[0]/b[0];
for(i=1;i<N;i++)
y[i]=(f[i]-a[i]*y[i-1])/(b[i]-a[i]*bt[i-1]);
x[N-1]=y[N-1];
for(i=N-2;i>=0;i--)
x[i]=y[i]-bt[i]*x[i+1];
}
void main()
{double x[N]={27.7,28,29,30},y[N]={4.1,4.3,4.1,3.0},b[N]={2,2,2,2};
double h[N],miu[N],lanmada[N],d[N],m[N];
double s0=3.0,s3=-4.0;
double xx,s;
int i;
miu[0]=lanmada[N-1]=h[N-1]=0;
for(i=0;i<N-1;i++)
h[i]=x[i+1]-x[i];
for(i=1;i<N-1;i++) //for(i=0;i<N;i++)
miu[i]=h[i-1]/(h[i-1]+h[i]);
miu[N-1]=1; // ////
for(i=1;i<N-1;i++)
lanmada[i]=h[i]/(h[i-1]+h[i]);
for(i=1;i<N-1;i++) //for(i=0;i<N-1;i++)
d[i]=6*((y[i+1]-y[i])/(x[i+1]-x[i])-(y[i]-y[i-1])/(x[i]-x[i-1]))/(h[i]+h[i-1]);
lanmada[0]=1;
d[0]=6*((y[1]-y[0])/h[0]-s0)/h[0];//d[0]=6*((y[1]-y[0])-s0)/h[0];
d[N-1]=6*(s3-(y[N-1]-y[N-2])/(h[N-2]))/h[N-2];
//d[N]=6*(s3-(y[i]-y[i-1])/(x[i]-x[i-1]))/h[i-1];
for(i=0;i<N;i++)b[i]=2;//////
zhuiganfa(miu,b,lanmada,d,m);//zhuiganfa(miu,d,b,m,lanmada);
for(i=0;i<N-1;i++)
for(xx=x[i];xx<x[i+1];xx+=0.01)
{ s=m[i]*(x[i+1]-xx)*(x[i+1]-xx)*(x[i+1]-xx)/6*h[i]
+m[i+1]*(xx-x[i])*(xx-x[i])*(xx-x[i])/6*h[i]
+(y[i]-m[i]*h[i]*h[i]/6)*(x[i+1]-xx)/h[i]
+(y[i+1]-m[i+1]*h[i]*h[i]/6)*(xx-x[i])/h[i] ;
printf("%lf,%lfn",xx,s);
}
}
//for(i=0;i<N;i++)
// printf("%lf,%lf,%lf,%lf,%lfn",miu[i],b[i],lanmada[i],d[i],m[i]);
程序中//后绿色部分是他原来的内容或缺少的语句,有5处错误.
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 10:35
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社