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

📄 cal.cpp

📁 vc下实现
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
double **TwoArrayAlloc(int, int);
void TwoArrayFree(double **);
double SMOOTH5(double *x,double *y,double **z,int n,int m,double **a,int p,int q,double *dt1,double *dt2,double *dt3)
{
	int i,j,k,l,kk;
	double apx[20],apy[20],bx[20],by[20],u[20][20],**v,xx,yy;
	double t[20],t1[20],t2[20],d1,d2,g,g1,g2,x1,x2,y1,dd,dt;

	v=TwoArrayAlloc(20,m);
	xx=0;
	for(i=1;i<=n;i++)
		xx=xx+x[i-1]/n;
	yy=0;
	for(i=1;i<=m;i++)
		yy=yy+y[i-1]/m;
	d1=n;
	apx[0]=0;
	for(i=1;i<=n;i++)
		apx[0]=apx[0]+x[i-1]-xx;
	apx[0]=apx[0]/d1;
	for(j=1;j<=m;j++)
	{
		v[0][j-1]=0;
		for(i=1;i<=n;i++)
			v[0][j-1]=v[0][j-1]+z[i-1][j-1];
		v[0][j-1]=v[0][j-1]/d1;
	}
	if(p>1)
	{
		d2=0;
		apx[1]=0;
		for(i=1;i<=n;i++)
		{
			g=x[i-1]-xx-apx[0];
			d2=d2+g*g;
			apx[1]=apx[1]+(x[i-1]-xx)*g*g;
		}
		apx[1]=apx[1]/d2;
		bx[1]=d2/d1;
		for(j=1;j<=m;j++)
		{
			v[1][j-1]=0;
			for(i=1;i<=n;i++)
			{
				g=x[i-1]-xx-apx[0];
				v[1][j-1]=v[1][j-1]+z[i-1][j-1]*g;
			}
			v[1][j-1]=v[1][j-1]/d2;
		}
		d1=d2;
	}
	for(k=3;k<=p;k++)
	{
		d2=0;
		apx[k-1]=0;
		for(j=1;j<=m;j++)
			v[k-1][j-1]=0;
		for(i=1;i<=n;i++)
		{
			g1=1;
			g2=x[i-1]-xx-apx[0];
			for(j=3;j<=k;j++)
			{
				g=(x[i-1]-xx-apx[j-2])*g2-bx[j-2]*g1;
				g1=g2;
				g2=g;
			}
			d2=d2+g*g;
			apx[k-1]=apx[k-1]+(x[i-1]-xx)*g*g;
			for(j=1;j<=m;j++)
				v[k-1][j-1]=v[k-1][j-1]+z[i-1][j-1]*g;
		}
		for(j=1;j<=m;j++)
			v[k-1][j-1]=v[k-1][j-1]+z[i-1][j-1]*g;
		apx[k-1]=apx[k-1]/d2;
		bx[k-1]=d2/d1;
		d1=d2;
	}
	d1=m;
	apy[0]=0;
	for(i=1;i<=m;i++)
		apy[0]=apy[0]+y[i-1]-yy;
	apy[0]=apy[0]/d1;
	for(j=1;j<=p;j++)
	{
		u[j-1][0]=0;
		for(i=1;i<=m;i++)
			u[j-1][0]=u[j-1][0]+v[j-1][i-1];
		u[j-1][0]=u[j-1][0]/d1;
	}
	if(q>1)
	{
		d2=0;
		apy[1]=0;
		for(i=1;i<=m;i++)
		{
			g=y[i-1]-yy-apy[0];
			d2=d2+g*g;
			apy[1]=apy[1]+(y[i-1]-yy)*g*g;
		}
		apy[1]=apy[1]/d2;
		by[1]=d2/d1;
		for(j=1;j<=p;j++)
		{
			u[j-1][1]=0;
			for(i=1;i<=m;i++)
			{
				g=y[i-1]-yy-apy[0];
				u[j-1][1]=u[j-1][1]+v[j-1][i-1]*g;
			}
			u[j-1][1]=u[j-1][1]/d2;
		}
		d1=d2;
	}
	for(k=3;k<=q;k++)
	{
		d2=0;
		apy[k-1]=0;
		for(j=1;j<=p;j++)
			u[j-1][k-1]=0;
		for(i=1;i<=m;i++)
		{
			g1=1;
			g2=y[i-1]-yy-apy[0];
			for(j=3;j<=k;j++)
			{
				g=(y[i-1]-yy-apy[j-2])*g2-by[j-2]*g1;
				g1=g2;
				g2=g;
			}
			d2=d2+g*g;
			apy[k-1]=apy[k-1]+(y[i-1]-yy)*g*g;
			for(j=1;j<=p;j++)
				u[j-1][k-1]=u[j-1][k-1]+v[j-1][i-1]*g;
		}
		for(j=1;j<=p;j++)
			u[j-1][k-1]=u[j-1][k-1]/d2;
		apy[k-1]=apy[k-1]/d2;
		by[k-1]=d2/d1;
		d1=d2;
	}
	v[0][0]=1;
	v[1][0]=-apy[0];
	v[1][1]=1;
	for(i=1;i<=p;i++)
	for(j=1;j<=q;j++)
		a[i-1][j-1]=0;
	for(i=3;i<=q;i++)
	{
		v[i-1][i-1]=v[i-2][i-2];
		v[i-1][i-2]=-apy[i-2]*v[i-2][i-2]+v[i-2][i-3];
		if(i>=4)
			for(k=i-2;k>=2;k--)
				v[i-1][k-1]=-apy[i-2]*v[i-2][k-1]+v[i-2][k-2]-by[i-2]*v[i-3][k-1];
		v[i-1][0]=-apy[i-2]*v[i-2][0]-by[i-2]*v[i-3][0];
	}
	for(i=1;i<=p;i++)
	{
		if(i==1)
		{
			t[0]=1;
			t1[0]=1;
		}
		else if(i==2)
		{
			t[0]=-apx[0];
			t[1]=1;
			t2[0]=t[0];
			t2[1]=t[1];
		}
		else 
		{
			t[i-1]=t2[i-2];
			t[i-2]=-apx[i-2]*t2[i-2]+t2[i-3];
			if(i>=4)
				for(k=i-2;k>=2;k--)
					t[k-1]=-apx[i-2]*t2[k-1]+t2[k-2]-bx[i-2]*t1[k-1];
			t[0]=-apx[i-2]*t2[0]-bx[i-2]*t1[0];
			t2[i-1]=t[i-1];
			for(k=i-1;k>=1;k--)
			{
				t1[k-1]=t2[k-1];
				t2[k-1]=t[k-1];
			}
		}
		for(j=1;j<=q;j++)
		for(k=i;k>=1;k--)
		for(l=j;l>=1;l--)
			a[k-1][l-1]=a[k-1][l-1]+u[i-1][j-1]*t[k-1]*v[j-1][l-1];
	}
	*dt1=0;
	*dt2=0;
	*dt3=0;
	for(i=1;i<=n;i++)
	{
		x1=x[i-1]-xx;
		for(j=1;j<=m;j++)
		{
			y1=y[j-1]-yy;
			x2=1;
			dd=0;
			for(k=1;k<=p;k++)
			{
				g=a[k-1][q-1];
				for(kk=q-1;kk>=1;kk--)
					g=g*y1+a[k-1][kk-1];
				g=g*x2;
				dd=dd+g;
				x2=x2*x1;
			}
			dt=dd-z[i-1][j-1];
			if(fabs(dt)>(*dt3))
				*dt3=fabs(dt);
			*dt1=(*dt1)+dt*dt;
			*dt2=(*dt2)+fabs(dt);
		}
	}
	TwoArrayFree(v);
	return(1);
}
void main()
{
	int i,j,n,m,p,q;
	double *x,*y,**z,**a,dt1,dt2,dt3;

	n=11;
	m=21;
	p=6;
	q=5;

	x=(double *)calloc(n,sizeof(double));
	if(x==NULL)
		exit(0);
	y=(double *)calloc(m,sizeof(double));
	if(y==NULL)
		exit(0);
	z=TwoArrayAlloc(n,m);
	a=TwoArrayAlloc(p,q);

/*	for(i=1;i<=n;i++)
		x[i-1]=0.2*(i-1);
	for(i=1;i<=m;i++)
		y[i-1]=0.1*(i-1);
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
		z[i-1][j-1]=exp(x[i-1]*x[i-1]-y[j-1]*y[j-1]);
*/
	SMOOTH5(x,y,z,n,m,a,p,q,&dt1,&dt2,&dt3);
	for(i=1;i<=p;i++)
	{
		for(j=1;j<=q;j++)
			printf("%.10f\t",a[i-1][j-1]);
		printf("\n");
	}
	printf("\n%.10e\t%.10e\t%.10e\n",dt1,dt2,dt3);
	
	free(x);
	free(y);
	TwoArrayFree(z);
	TwoArrayFree(a);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -