1、 /v11用于存放110,g12用于存放g0g11 int i,j=0; int AllD=1; /三角对阵的行列式 double Mv=1,Mu=1; /Mv表示1*2*10,Mu表示1*2*10 double M12,X311,X211,X111,X011; /M12用于存放M0M11,X311用于存放x3的系数,X211用于存放x2的系数, /X111用于存放x的系数,X011用于存放常数项的系数 printf(Please input x(i):n); for(i=0;i12;i+) xi=0;i+) scanf(%lf,&xi);Please input y(i):yi); for(
2、i=1;11;i+) ui=(xi-xi-1)/(xi+1-xi-1); /110的求解公式 vi=1-ui; /110的求解公式 gi=(6/(xi+1-xi-1)*(yi+1-yi)/(xi+1-xi)-(yi-yi-1)/(xi-xi-1); /g1g10的求解公式 g0=(6/(x1-x0)*(y1-y0)/(x1-x0)-0.75); /g0的求解公式 g11=(6/(x11-x10)*(18-(y11-y10)/(x11-x10); /g11的求解公式u(1) to u(10): printf( %f , ui); j+; if(j%4=0) printf( j=0;v(1) to
3、 v(10):, vi);g(0) to g(11):, gi);=12; AllD=AllD*2;=10; Mv=Mv*vi; Mu=Mu*ui; /采用克拉默法则进行线性方程组的求解xi=Di/D double D12; D0=g0*AllD/2+Mv*g11; D11=g11*AllD/2+Mu*g0;i+) Di=gi*AllD/2;=11;i+) Mi=Di/AllD; X3i=(Mi-Mi-1)/(6*(xi-xi-1); /计算想x3系数的公式 X2i=(xi*Mi-1-xi-1*Mi)/(2*(xi-xi-1); /计算想x2系数的公式 X1i=(-xi*xi*Mi-1+xi-
4、1*xi-1*Mi)/(2*(xi-xi-1)+(yi-(Mi*(xi-xi-1)*(xi-xi-1)/6)-(yi-1-(Mi-1*(xi-xi-1)*(xi-xi-1)/6)/(xi-xi-1); /计算想x系数的公式 X0i=xi*xi*xi-xi-1*xi-1*xi-1-(yi-(Mi*(xi-xi-1)*(xi-xi-1)/6)*xi-1)/(xi-xi-1)+(yi-1-(Mi-1*(xi-xi-1)*(xi-xi-1)/6)*xi)/(xi-xi-1); /计算常数项的公式 %.2f, %.2f :,xi,xi+1);S= %fx3+%fx2+%fx+%fn,X3i+1,X2i+
5、1,X1i+1,X0i+1); 、最小二乘拟合函数:由散点图,设想y=f(x)是双曲型的,并且具有下面的形式y=。做变量替换y1=,x1=,则式变为y1=a+b*x1。i1234567x1(i)=0.052630.040000.032260.026320.022730.018190.01852y1(i)=0.030960.020410.013640.010120.009280.00835解方程组即由克拉默法则解得a=-0.024,b=1.4878代入式,得经验方程y=#include malloc.hmath.hSmooth(double *x,double *y,double *a,int
6、n,int m,double *dt1,double *dt2,double *dt3);void main() int i ,n ,m ;double *x,*y,*a,dt1,dt2,dt3,b;n = 7;m =3;b = 0;x = (double *)calloc(n,sizeof(double);if(x = NULL) printf(内存分配失败nexit (0); y = (double *)calloc(n,sizeof(double);if(y = NULL) a = (double *)calloc(n,sizeof(double);if(a = NULL) x0=19;
7、x1=25;x2=31;x3=38;x4=40;x5=50;x6=54;y0=19.0;y1=32.3;y2=49.0;y3=73.3;y4=98.8;y5=107.8;y6=119.7;Smooth(x,y,a,n,m,&dt1,&dt2,&dt3);for(i=1;=m;i+) a%d = %.10fn,(i-1),ai-1);拟合多项式与数据点偏差的平方和为:%.10en,dt1);拟合多项式与数据点偏差的绝对值之和为:,dt2);拟合多项式与数据点偏差的绝对值最大值为:,dt3);free(x);free(y);free(a);Smooth(double *x,double *y,do
8、uble *a,int n,int m,double *dt1,double *dt2,double *dt3)int i ,j ,k ;double *s,*t,*b,z,d1,p,c,d2,g,q,dt;s = (double *)calloc(n,sizeof(double);if(s = NULL) t = (double *)calloc(n,sizeof(double);if(t = NULL) b = (double *)calloc(n,sizeof(double);if(b = NULL) z = 0;=n;z=z+xi-1/n;b0=1;d1=n;p=0;c=0;p=p+x
9、i-1-z;c=c+yi-1;c=c/d1;p=p/d1;a0=c*b0;if(m1) t1=1;t0=-p;d2=0;g=0;q=xi-1-z-p;d2=d2+q*q;c=yi-1*q+c;g=(xi-1-z)*q*q+g;c=c/d2;p=g/d2;q=d2/d1;d1=d2;a1=c*t1;a0=c*t0+a0;for(j=3;j=4) for(k=j-2;k=2;k-) sk-1=-p*tk-1+tk-2-q*bk-1;s0=-p*t0-q*b0;q=sj-1;for(k=j-1;=1;q=q*(xi-1-z)+sk-1;aj-1=c*sj-1;tj-1=sj-1;ak-1=c*sk-
10、1+ak-1;bk-1=tk-1;tk-1=sk-1;*dt1=0;*dt2=0;*dt3=0;q=am-1;for(k=m-1;q=q*(xi-1-z)+ak-1;dt=q-yi-1;if(fabs(dt)*dt3) *dt3=fabs(dt);*dt1=*dt1+dt*dt;*dt2=*dt2+fabs(dt);free(s);free(t);free(b);return(1);4、上机调试说明: 、三次样条差值函数:5、心得体会:通过此次试验我加深了对三次样条插值和曲线拟合的最小二乘法的理解,明白到计算机科学对数值计算的作用,即计算机能极大地减轻人的工作量,但这必须建立在能熟练编程的基础上。所以二者能否完美地结合取决于我们是否弄清问题本质并用计算机语言表达出来。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1