📄 zuixiaoercheng.txt
字号:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
double *getpointx(int m)
{int i;
double *x;
x=(double *)malloc(m*sizeof(double));
printf("输入数据xi为:\n");
for(i=0;i<m;i++)
scanf("%lf",&x[i]);
return x;
}
double *getpointy(int m)
{int i;
double *y;
y=(double *)malloc(m*sizeof(double));
printf("输入数据yi为:\n");
for(i=0;i<m;i++)
scanf("%lf",&y[i]);
return y;
}
double *quanzhi(int m)
{int i,q;
double *w;
w=(double *)malloc(m*sizeof(double));
printf("如果有权函数请输入1,否则输入0\n");
scanf("%d",&q);
if(q==1)
{
printf("请输入权值:\n");
for(i=0;i<m;i++)
scanf("%lf",&w[i]);}
else
{
for(i=0;i<m;i++)
*(w+i)=1;}
return w;
}
double *chushiP(double *p[3],int m)
{ int i;
for(i=0;i<3;i++)
{
p[i]=(double *)malloc(m*sizeof(double));
}
return *p;
}
double *chushiA(int m)
{ double *A;
A=(double *)malloc(m*sizeof(double));
return A;
}
double *chushiB(int m)
{ double *B;
B=(double *)malloc(m*sizeof(double));
return B;
}
double *a0(double *p[3],double *y,int m)
{ int i;
double u=0,v=0,*a;
a=(double *)malloc(m*sizeof(double));
for(i=0;i<m;i++)
{
p[0][i]=1;
u+=y[i]*p[0][i];
v+=p[0][i]*p[0][i];
}
*a=u/v;
return a;
}
double f0(double *y,int m)
{
double f0=0;
int i;
for(i=0;i<m;i++)
f0+=y[i]*y[i];
return(f0);
} /*计算内积(f,f)*/
double f1(double *x,double *p[3],double *w,int k,int m)
{
double f1=0;
int i;
for(i=0;i<m;i++)
f1=f1+w[i]*x[i]*p[(k-1)%3][i]*p[(k-1)%3][i];
return(f1);
} /*计算内积(xPk,Pk)*/
double f2(double *p[3],double *w,int k,int m)
{
double f2=0;
int i;
for(i=0;i<m;i++)
f2=f2+w[i]*p[k%3][i]*p[k%3][i];
return(f2);
} /*计算内积(Pk,Pk)*/
double f3(double *y,double *p[3],double *w,int k,int m)
{
double f3=0;
int i;
for(i=0;i<m;i++)
f3=f3+w[i]*y[i]*p[k%3][i];
return(f3);
} /*计算内积(f,Pk)*/
double wucha(double t,double *p[3],double *w,double *a,int k,int m)
{
t=t-f2(p,w,k,m)*a[k]*a[k];
return t;
}
int pk(double *A,double *B,double *a,double *x,double *y,double *w,double *p[3],double t,int k,int m)
{int i;
while(t>0.0001)
{k++;
A[k]=f1(x,p,w,k,m)/f2(p,w,k-1,m);
for(i=0;i<m;i++)
{
if(k==1)
p[k][i]=(x[i]-A[k])*p[k-1][i];
p[k%3][i]=(x[i]-A[k])*p[(k-1)%3][i]-B[k-1]*p[(k-2)%3][i];
}
B[k]=f2(p,w,k,m)/f2(p,w,k-1,m);
a[k]=f3(y,p,w,k,m)/f2(p,w,k,m);
t=wucha(t,p,w,a,k,m);}
return k;
}
void Out0(double *A,double *B,double *a,int k)
{
int i;
printf("输出Ai的值:\n");
for(i=1;i<=k;i++)
{
printf("A[%d]=%lf\n",i,A[i]);
}
printf("输出Bi的值:\n");
for(i=1;i<=k;i++)
{
printf("B[%d]=%lf\n",i,B[i]);
}
printf("输出ai的值:\n");
for(i=0;i<=k;i++)
{
printf("a[%d]=%lf\n",i,a[i]); /*输出相应系数*/
}
}
void Out1(double *A,double *B,double *a,int k)
{
int i;
printf("输出正交多项式:\n");
printf("P0(x)=1\n");
printf("P1(x)=x-%lf\n",A[1]);
for(i=2;i<=k;i++)
printf("P%d(x)=(x-%lf)*P%d(x)-%lf*P%d(x)\n",i,A[i],i-1,B[i-1],i-2);
printf("输出用最小二乘法拟合的多项式:\n");
printf("F(x)=%lfp%d(x)",a[0],0);
for(i=1;i<=k;i++)
printf("+%lfp%d(x)",a[i],i);
}
void main()
{
int m,k=0;
double t,*w,*x,*y;
double *p[3],*A,*B,*a;
printf("输入测试点数m:");
scanf("%d",&m);
x=getpointx(m);
y=getpointy(m);
w=quanzhi(m);
*p=chushiP(p,m);
A=chushiA(m);
B=chushiB(m);
a=a0(p,y,m);
t=f0(y,m);
t=wucha(t,p,w,a,k,m);
k=pk(A,B,a,x,y,w,p,t,k,m);
Out0(A,B,a,k);
Out1(A,B,a,k);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -