⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zuixiaoercheng.txt

📁 利用给定的点
💻 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 + -